Zeiger auf eine Funktion in einer Klasse
-
Ich muss, um einen Thread zu erstellen, einen Zeiger auf die Funktion übergeben vom Typ void*(void*). Hier mein Beispiel Code:
void Funktion1(void *dummy); class Beispiel { public: void Funktion2(void *dummy); Beispiel() { _beginthread(Funktion1,0,NULL); _beginthread(Funktion2,0,NULL); } };Der Aufruf für Funktion1 funktioniert, nur der von Funktion2, die in einer Klasse liegt, klappt nicht:
12 C:\Dev-Cpp\main8.cpp argument of type `void (Beispiel::)(void*)' does not match `void (*)(void*)'Wie lässt sich das beheben, ich hab echt keine Ahnung?
mfg.
-
funktion2 static machen
-
miller_m schrieb:
funktion2 static machen
So einfach? Ist ja cool. Danke!
mfg.
-
das hat aber auch nachteile. du musst z.b. der funktion einen pointer auf das jeweilige objekt mitgeben, damit sie darauf zugreifen kann.
-
net schrieb:
das hat aber auch nachteile. du musst z.b. der funktion einen pointer auf das jeweilige objekt mitgeben, damit sie darauf zugreifen kann.
...oder ich mache diese wieder static.
void Funktion1(void *dummy); class Beispiel { private: static int Test; public: static void Funktion2(void *dummy) { Test++; } void Funktion3() { Test++; } Beispiel() { Test++; _beginthread(Funktion1,0,NULL); _beginthread(Funktion2,0,NULL); Funktion3(); } };
-
joomoo schrieb:
...oder ich mache diese wieder static.
die haste dann aber auch nur 1 mal. sobald du mehrere instanzen des objekts brauchst geht das nicht mehr.
-
net schrieb:
joomoo schrieb:
...oder ich mache diese wieder static.
die haste dann aber auch nur 1 mal. sobald du mehrere instanzen des objekts brauchst geht das nicht mehr.
Stimmt das ist nicht gut. Okay, ich habe es jetzt mal umgeschrieben, so das ein Zeiger auf die Objekte mit übergeben wird:
class Beispiel { private: int Test; public: static void Funktion2(void *was) { int *pTest = (int*)was; *pTest++; char text[50]; sprintf(text,"%i",*pTest); MessageBox(0,text,text,0); } Beispiel() { Test = 50; Test++; _beginthread(Funktion2,0,(void *)&Test); } };Allerdings steht in der MessageBox 48 und nicht 52. Wenn ich die Zeile
*pTest++;
durch
*pTest += 1;
ersetze, dann geht's. Warum das denn?
-
*pTest++ ist identisch mit den Zeilen:
*pTest; // macht nix, wird also ignoriert (und ggf. eine Warnung ausgegeben je nach Compiler und Einstellung) pTest = pTest + 1; // der Zeiger wird um 1 erhöht und zeigt dann auf das nächste intDas nächste int ist wohl zufällig bei Dir eine 48.
*pTest += 1 ist identisch mit
*pTest = *pTest + 1; // hier wird der Inhalt worauf pTest zeigt um 1 erhöht
-
joomoo schrieb:
Allerdings steht in der MessageBox 48 und nicht 52. Wenn ich die Zeile
*pTest++;
durch
*pTest += 1;
ersetze, dann geht's. Warum das denn?"Operator Precedence". ++ (Post-Inkrement) hat Vorrang gegenüber * (Indirektion). Demzufolge macht '*pTest++;' das gleiche wie 'pTest++;'. Dh, du setzt pTest auf einen Speicherbereich, der dir gar nicht gehört. Das Dereferenzieren bringt überhaupt nichts mehr. Du willst wohl eher sowas wie '(*pTest)++'.
edit:
Zu spät, sollte doch eher mal die Anzeige aktualisieren.
-
Danke. Das hat es also mit dem ++ auf sich.
Ich hab jetzt mal das ganze für mehrere Variablen mit einer Struktur geschrieben:
struct Daten { int Test1; char Test2[50]; }; class Beispiel { private: Daten Test; public: static void Funktion2(void *was) { Daten *pTest = (Daten*)was; pTest->Test1 += 5; sprintf(pTest->Test2,"%i",pTest->Test1); MessageBox(0,pTest->Test2,"Funktion2",0); } Beispiel() { Test.Test1 = 50; Test.Test1++; _beginthread(Funktion2,0,(void *)&Test); Sleep(2000); MessageBox(0,Test.Test2,"Beispiel",0); } };Gibt es noch Sachen daran auszusetzen, oder welche die ich verbessern sollte?
mfg.
-
joomoo schrieb:
Danke. Das hat es also mit dem ++ auf sich.
Ich hab jetzt mal das ganze für mehrere Variablen mit einer Struktur geschrieben:
struct Daten { int Test1; char Test2[50]; }; class Beispiel { private: Daten Test; public: static void Funktion2(void *was) { Daten *pTest = (Daten*)was; pTest->Test1 += 5; sprintf(pTest->Test2,"%i",pTest->Test1); MessageBox(0,pTest->Test2,"Funktion2",0); } Beispiel() { Test.Test1 = 50; Test.Test1++; _beginthread(Funktion2,0,(void *)&Test); Sleep(2000); MessageBox(0,Test.Test2,"Beispiel",0); } };Gibt es noch Sachen daran auszusetzen, oder welche die ich verbessern sollte?
mfg.
Ich dazu mal eine Frage: Wenn ich in Funktion 2 jetzt eine Variable erstelle, die nicht static ist, ist diese dann in den ganzen Threads von den verschiedenen Instanzen auch gleich?
Weil wenn nicht, dann gäbe es ja eigentlich keinen Unterschied ob ich eine Funktion static mache oder nicht, oder?
mfg.