2010-06-20 6 views
5

Le volatile peut-il être utilisé pour les objets de classe? Comme:Définition d'un objet de classe volatile

volatile Myclass className; 

Le problème est qu'il ne compile pas, partout quand une méthode est invoquée, l'erreur dit: erreur C2662: « fonction »: ne peut pas convertir pointeur « this » de « MyClass volatile 'à' MyCLass & '

Quel est le problème ici et comment le résoudre?

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

Notez qu'en C++, «volatile» ne garantit pas la sécurité des threads. C'est différent de, par exemple, .NET, où c'est le cas. – sbi

Répondre

12

Oui, vous pouvez, mais vous ne pouvez appeler des fonctions membres qui sont déclarées volatile (comme le mot-clé const). Par exemple:

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

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

Modifier en fonction de votre code:

bool volatile push(struct Data element); 

déclare un non - fonction membre volatile qui retourne une bool volatile (= volatile bool). Vous voulez

bool push(struct Data element) volatile; 
+2

Qu'en est-il des constructeurs et des destructeurs et des variables (propriétés) déclarées en classe? – maximus

+0

J'ai fait comme vous l'avez dit, mais de toute façon les mêmes messages d'erreur .. – maximus

+2

@maximus, constructeurs et destructeurs ne peuvent pas être surchargés avec 'volatile' (ou' const'), et les variables membres héritent de ces propriétés de l'instance de classe. En ce qui concerne vos messages d'erreur, veuillez poster le code exact que vous utilisez. –

2

Dans la grammaire C++, "volatile" et " const "sont appelés" modificateurs CV ". Cela signifie que "volatile" fonctionne exactement de la même manière que "const" du point de vue syntaxique. Vous pouvez remplacer tout "volatile" par "const" alors vous pouvez comprendre pourquoi votre code compile ou non.

0

Oui. On peut utiliser. S'il vous plaît voir le code modifié. J'espère que ça devrait marcher maintenant.

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