[SOLVED]SDL_Thread mit Memberfunktionen
-
Morgen,
ich würde SDL_Thread gern innerhalb einer Klasse mit Memberfunktionen verwenden. Leider scheitert dies an der Typumwandlung.
Beispiel:
#include "SDL/SDL_thread.h" class Threaded { int member_func() { return 0; } SDL_Thread* thread = nullptr; public: void operator()() { thread = SDL_CreateThread(member_func,nullptr); } } example; int main() { example(); return 0; }Der Compiler gibt mir dabei folgende Fehlermeldung aus:
main.cpp: In Elementfunktion »void Threaded::operator()()«: main.cpp:12:58: Fehler: »Threaded::member_func« kann nicht vom Typ »int (Threaded::)()« in den Typ »int (*)(void*)« umgewandelt werdenWelche Möglichkeiten gibt es, diesen Fehler zu umgehen?
Mit freundlichen Grüßen,
KiEDIT:
Ich habe mittlerweile erfahren, dass nur statische Member Funktionen in dieser Form gecastet werden können. Die Lösung ist also Folgende:#include "SDL/SDL_thread.h" class Threaded { int member_func() { return 0; } static int static_member_func(Threaded* t) { return t->member_func(); } SDL_Thread* thread = nullptr; public: void operator()() { thread = SDL_CreateThread((int(*)(void*))static_member_func,this); } } example; int main() { example(); return 0; }
-
Deine Lösung mag zwar funktionieren, ist aber falsch und erzeugt undefiniertes Verhalten. (Lies: Es kann schiefgehen, muss aber nicht.)
Richtig wäre, wenn die Funktion einen void* nimmt und diesen in ein Threaded* castet:
static int static_member_func(void* t) { return static_cast<Threaded*>(t)->member_func(); }
-
Danke, wird geändert.