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.