Methode zu Funktion casten?!?
-
Hallo!
Ich hab grad ein wenig mit SDL angefangen und wollte nun einen SDL_thread laufen lassen. Die SDL Webseite sagt dazu folgendes:
SDL_Thread *SDL_CreateThread(int (*fn)(void *), void *data);Da ich das ganze in Klassen kapseln möchte habe ich aber nur Methoden fürs Callback zur verfügung:
short SDLApplication::run() { m_RunThread = SDL_CreateThread(eventLoop, NULL); if ( m_RunThread == NULL ) { m_ErrorMsg = SDL_GetError(); return -1; } // [...] }int SDLApplication::eventLoop() {/* [...] */}Dieser Versuch wird mit Folgender compilermeldung quitiert:
error: argument of type `int (SDLApplication::)()' does not match `int ()(void)'
Wie bekomme ich nun meine Methode da mit rein? (werd daraus nicht schlau).
-
Methoden haben einen (versteckten) zusätzlichen Parameter 'class* this', der mit übergeben werden muß (wie das passiert, hängt vom verwendeten Compiler ab), deshalb kannst du sie nicht so einfach in "normale" Funktionen umwandeln.
Du könntest höchstens eine statische Methode definieren und übergeben(die hat keinen this-Pointer) und innerhalb dieser Methode das Objekt festlegen, das letztendlich loopen soll.
-
Ergänzung: Für dich hiese das:
class SDLApplication { public: static int s_eventloop(void* app) { SDLApplication* self=(SDLApplication*)app; self->eventloop(); } } short SDLApplication::run() { m_RunThread = SDL_CreateThread(s_eventLoop, this); ... }
-
Dieses Problem hatte ich auch schon, nur im Zusammenhang mit Fenstern und der Windows-Nachrichtenschleife.
Habe das am Ende so gelöst, dass die Klasse nen statisches Element (ne std::map) bekam, in welchem sich alle Objekte im Konstruktor eingetragen und im Desktruktor ausgetragen haben. Über das Handle habe ich in der Nachrichtenschleife, dann immer gewusst für welches Objekt die Nachricht bestimmt ist und an dieses die Nachricht weitergeleitet.Ist halt leider das Übel, das man mit OO und prozeduralen APIs hat.