2010-06-20 17 views
5

¿Se puede usar el volátil para objetos de clase? igual:Definición del objeto de clase volátil

volatile Myclass className; 

El problema es que no se compila, todas partes cuando se invoca un método, el error dice: error C2662: 'función': no ​​puede convertir este puntero de 'MiClase volátiles 'a' MyCLass & '

¿Cuál es el problema aquí y cómo solucionarlo?

EDIT:

class Queue { 
      private: 
       struct Data *data; 
       int amount; 
       int size; 
      public: 
       Queue(); 
       ~Queue(); 
       bool volatile push(struct Data element); 
       bool volatile pop(struct Data *element); 
       void volatile cleanUp(); 
      }; 
    ..... 
    volatile Queue dataIn; 

     ..... 

    EnterCriticalSection(&CriticalSection); 
    dataIn.push(element); 
    LeaveCriticalSection(&CriticalSection); 
+0

Tenga en cuenta que en C++, 'volátil' no garantiza la seguridad del hilo. Eso es diferente de, por ejemplo, .NET, donde lo hace. – sbi

Respuesta

12

Sí, se puede, pero entonces sólo puede llamar a funciones miembro que se declaran volatile (al igual que la palabra clave const). Por ejemplo:

struct foo { 
    void a() volatile; 
    void b(); 
}; 

volatile foo f; 
f.a(); // ok 
f.b(); // not ok 

Editar basado en su código:

bool volatile push(struct Data element); 

declara un no - volatile función miembro que devuelve un bool volatile (= volatile bool). ¿Quieres

bool push(struct Data element) volatile; 
+2

¿Qué pasa con los constructores y los destructores y las variables (propiedades) declarados en clase? – maximus

+0

Hice como usted dijo, pero de todos modos los mismos mensajes de error .. – maximus

+2

@maximus, constructores y destructores no pueden ser sobrecargados con 'volátil' (o' const'), y las variables miembro heredan estas propiedades de la instancia de la clase. En cuanto a sus mensajes de error, publique el código exacto que está utilizando. –

2

En la gramática de C++, "volátil" y " const "se llaman" modificadores de CV ". Eso significa que "volátil" funciona exactamente de la misma manera que "const" desde el punto de vista sintáctico. Puede reemplazar todo "volátil" con "const", entonces puede entender por qué su código se compila o no.

0

Sí. Nosotros podemos usar. Por favor mira el código modificado. Espero que debería funcionar ahora.

class Queue { 
      private: 
       struct Data *data; 
       int amount; 
       int size; 
      public: 
       Queue(); 
       ~Queue(); 
       bool push(struct Data element) volatile; 
       bool pop(struct Data *element) volatile; 
       void cleanUp() volatile; 
      }; 
..... 
volatile Queue dataIn; 

    ..... 

EnterCriticalSection(&CriticalSection); 
dataIn.push(element); 
LeaveCriticalSection(&CriticalSection); 
Cuestiones relacionadas