Hallo, On 4 Jul 2003 at 15:19, Ralf Corsepius wrote:
Am Fre, 2003-07-04 um 14.29 schrieb Michael Gebhart:
Hi zusammen,
ich möchte (in C++) einen Thread starten, welcher eine Elementfunktion einer Klasse ausführt.
Also ich habe eine Klasse:
class testklasse { public: int erstefunktion(); void zweitefunktion(void *parameter); };
pthread_create(&thread_id, NULL, (void *)&testklasse::zweitefunktion, (void *)"test");
So hatte ich es versucht. Allerdings meldet der Compiler:
warning: converting from `void (testklasse::*)(void*)' to ` void*'
und
warning: invalid conversion from `void*' to `void*(*)(void*)'
Er kompiliert es zwar, jedoch bleiben diese Warnungen. Weiß jemand, was ich falsch mache?
Du castest die Adresse einer Member-Funktion [Typ: void (testklasse::*)(void*)] nach (void*) und versuchst diese an pthread_create an einer Stelle zu übergeben, an der ein Zeiger auf eine Funktion [Typ: void*(*)(void*)] erwartet wird.
Beachte: Zeiger auf Member-Funktion/Methode vs. Zeiger auf Funktion.
Wirf alle casts raus ("Casts are evil!" ;) ) und verwende eine echte Funktion statt einer Member-Funktion.
Design-Vorschlag: Das könnte dann im Falle eines Singleton-Objekts eine statische Member-Funktion sein, die nichts weiter tut, als auf eine statische Klassenvariable (im Konstruktor zugewiesen) zuzugreifen und für diese die nicht-statische Methode aufzurufen, die man eigentlich ausführen möchte. Kam in letzter Zeit bei mir häufiger vor. Im header: private: static testklasse * mpInstance; Im cxx: testklasse::mpInstance = 0; testklasse::testklasse() { mpInstance = this; } Verbesserungsvorschläge erwünscht. Grüße Stefan