2010-06-20 3 views
5

È possibile utilizzare la volatile per oggetti di classe? Come:Definizione dell'oggetto classe volatile

volatile Myclass className; 

Il problema è che non si compila, ovunque quando un metodo viene richiamato, l'errore dice: errore C2662: 'funzione': non è in grado di convertire puntatore 'this' da 'MyClass volatili 'a 'MyClass &'

qual è il problema qui e come risolverlo?

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

Si noti che in C++, 'volatile' non garantisce la sicurezza del thread. Questo è diverso da, per esempio, .NET, dove funziona. – sbi

risposta

12

Sì, è possibile, ma allora si può chiamare solo funzioni membro dichiarate volatile (proprio come la parola const). Per esempio:

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

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

Edit in base al codice:

bool volatile push(struct Data element); 

dichiara unnon - funzione volatile membro che restituisce un bool volatile (= volatile bool). Si vuole

bool push(struct Data element) volatile; 
+2

E i costruttori, i distruttori e le variabili (proprietà) dichiarate in classe? – maximus

+0

Ho fatto come hai detto, ma in ogni caso i messaggi di errore stesso .. – maximus

+2

@maximus, costruttori e distruttori non può essere sovraccaricato con 'volatile' (o' const'), e le variabili membro erediterà questi oggetti di l'istanza di classe. Per quanto riguarda i messaggi di errore, pubblica il codice esatto che stai utilizzando. –

2

In C++ grammatica, "volatile" e " const "sono chiamati" modificatori di CV ". Ciò significa che "volatile" funziona esattamente allo stesso modo di "const" dal punto di vista sintattico. Puoi sostituire tutti i "volatili" con "const", quindi puoi capire perché il tuo codice viene compilato o meno.

0

Sì. Possiamo usare. Si prega di consultare il codice modificato. Spero che dovrebbe funzionare ora.

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);