2010-06-20 8 views
5

Kann das Volatile für Klassenobjekte verwendet werden? Like:Variables Klassenobjekt definieren

volatile Myclass className; 

Das Problem ist, dass es nicht kompiliert, überall, wenn eine Methode aufgerufen wird, wird der Fehler sagt: Fehler C2662: ‚Funktion‘: nicht konvertieren kann ‚diesen‘ Zeiger von ‚flüchtiger MyClass 'zu' MyCLass & '

Was ist das Problem hier und wie man es löst?

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

Beachten Sie, dass 'volatile' in C++ keine Thread-Sicherheit garantiert. Das ist anders als zum Beispiel .NET. – sbi

Antwort

12

Ja, Sie können, aber dann können Sie nur Member-Funktionen aufrufen, die volatile (genau wie das const Schlüsselwort) deklariert sind. Zum Beispiel:

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

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

bearbeiten basierend auf Ihren Code:

bool volatile push(struct Data element); 

deklariert eine nicht - volatile Member-Funktion, die eine bool volatile zurückgibt (= volatile bool). Sie wollen

bool push(struct Data element) volatile; 
+2

Was ist mit Konstruktoren und Destruktoren und Variablen (Eigenschaften) in der Klasse deklariert? – maximus

+0

Ich habe getan, wie Sie sagten, aber trotzdem die gleichen Fehlermeldungen .. – maximus

+2

@ Maximus, Konstruktoren und Destruktoren können nicht mit 'volatile' (oder' const') überlastet werden, und Member-Variablen erben diese Eigenschaften von der Klasseninstanz. In Bezug auf Ihre Fehlermeldungen geben Sie bitte den genauen Code ein, den Sie verwenden. –

2

In C++ Grammatik, "flüchtig" und " const "werden" CV-Modifikatoren "genannt. Das heißt, "flüchtig" funktioniert genau so wie "const" aus syntaktischer Sicht. Sie können alle "flüchtigen" durch "const" ersetzen, dann können Sie verstehen, warum Ihr Code kompiliert oder nicht.

0

Ja. Wir können benutzen. Bitte beachten Sie den geänderten Code. Ich hoffe es sollte jetzt funktionieren.

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