Erreur c ++: utilisation non valide du membre ‘calls_object :: OBJECT’ dans une fonction membre statique

J’ai eu l’erreur suivante du code ci-dessous.

error: invalid use of member 'calls_object::OBJECT' in static member function| error: from this location

à partir de la ligne OBJECT->call(); ligne 29.

Fondamentalement, la fonction doit être statique car c’est vraiment une version simplifiée du code qui crée un thread Windows. Je n’arrive pas à utiliser les pointeurs dans une fonction statique, mais je peux créer l’object dans la fonction statique sans problème. Y a-t-il un autre moyen?

 CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)windowsthread, (LPVOID)i, NULL, &m_id); static DWORD_PTR WINAPI windowsthread() { OBJECT->call(); } 

l

 class object { private: public: object(){} ~object(){} void call(){} }; class calls_object { private: object* OBJECT; public: calls_object() { OBJECT = new object(); } ~calls_object(){} #ifdef _WIN32 static void windows_function() { OBJECT->call(); } #endif }; int main() { calls_object O; } 

Cette fonction:

 static void windows_function() { OBJECT->call(); } 

Est déclaré comme static . Cela signifie qu’il ne reçoit pas implicitement this pointeurs: en d’autres termes, il ne fonctionne pas sur une instance de calls_object . Par conséquent, il ne peut pas voir la variable membre OBJECT .

Déclarez la fonction comme non statique ou déclarez OBJECT tant que variable membre static (ce qui est plus logique dans votre application).

En gros, la fonction doit être statique car c’est vraiment une version simplifiée du code qui crée un thread Windows

Puisque vous traitez (malheureusement) avec une fonction ( CreateThread ) qui accepte un pointeur de fonction, vous ne pouvez même pas utiliser std::bind . Cependant, CreateThread vous permet de fournir une fonction qui accepte un pointeur (pour void , voir le prototype de ThreadProc ).

CreateThread simplement un pointeur sur un object tant que quasortingème argument de CreateThread et laissez windowsFunction(void*) recevoir ce pointeur. Dans windowsFunction() , qui serait toujours static ou global (en fait, vous n’avez pas du tout besoin de la classe calls_object ), vous pouvez calls_object ce pointeur en pointeur et en appeler call() .


Notez également que votre classe calls_object mémoire, car vous oubliez de delete le pointeur que vous avez créé dans le constructeur de calls_object :

 ~calls_object() { delete object; // DON'T FORGET THIS! } 

windows_function est une fonction membre statique et n’est donc associé à aucun object calls_object . OBJECT est un membre de données non static , il est donc associé à un object calls_object . Vous ne pouvez pas accéder à un membre de données non static partir d’un membre de données.

Il suffit de rendre la fonction non static et cela fonctionnera.

Pense-y de cette façon. Si vous n’avez même pas créé d’object de type calls_object et que votre fonction main était simplement:

 int main() { calls_object::windows_function(); } 

Où voulez-vous que cette fonction obtienne OBJECT ? OBJECT étant un membre non static , il n’existe que dans le cadre d’un object calls_object . Une fonction membre static ne peut pas simplement extraire OBJECT de nulle part.