Funktionspointer in Klasse!?
-
Hallo Leute,
ich versuche gerade einen Funktionpointer in einer C++ Klasse zu verwenden, was aber allerding nich klappt!? (VS2008) Beide Varianten A und B funktionieren nicht!?
fehler : Fehler 10 error C3867: "foo::TestFunc": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&foo::TestFunc", um einen Zeiger auf den Member zu erstellen.
Code:
class foo { typedef int (*funcPointer)(int*); int TestFunc(int* bar){} public: foo(void) { funcPointer bla = TestFunc; //A funcPointer bla = &TestFunc; //B } };
Kann mir jemand weiter helfen!?
-
Deine Funktion befindet sich in deiner Klasse, also musst du das dem Funktionspointer auch sagen:
class foo { typedef int (foo::*funcPointer)(int*); int TestFunc(int* bar){} public: foo(void) { funcPointer bla = &foo::TestFunc; //B } };
Nicht getestet, sollte aber funktionieren
-
Achso verstehe, d.h. der compiler rafft nich, wenn ich mich in der klasse befinde und elemente aus der selben klasse verwenden möchte, mann muss also den klassen namen explizit angeben!?
-
Die Funktion gehört fest zur Klasse, deswegen muss in Zeile 3 auch gesagt werden, wo sich die Funktion befindet (in der Klasse foo) und auch beim Definieren der Variable bla muss der Compiler wissen, dass wir die Funktion in foo meinen und nicht eine X-beliebige andere im global-scope.
-
Ahh ok verstehe danke;)
-
Es ist eine nicht-statische Elementfunktion. Als solche darf man innerhalb der Funktion this verwenden, welches auf magische Art und Weise auf das Objekt zeigt, dessen Elementfunktion aufgerufen wurde. Diese Information muss aber irgendwoher kommen. Man kann sich das als weiteren unsichtbaren Funktionsparameter vorstellen. Dementsprechend lässt sich die Funktion, was Funktionszeiger und deren Aufrufsyntax angeht, nicht wie eine normale freie Funktion behandeln. Aufrufen musst du das Ding z.B. so:
int i = 23; int j = (ein_bestimmtes_foo_object.*funcPointer)(&i); // oder z.B. int k = (this->*funcPointer)(&i);
-
Was ich nun nich verstehe, das ich die funktion nich aufrufen kann!? kompilerfehler
foo(void) { int tmp =34; funcPointer bla = &TestFunc; //B bla(&tmp); }
da gibts es mir folgender fehler:
Fehler 2 error C2064: Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt
-
Cyres schrieb:
funcPointer bla = &foo::TestFunc;
krümelkacker schrieb:
int k = (this->*funcPointer)(&i);
Wenigstens die Antworten sollte man zu seinen Fragen auch lesen
-
Lies doch mal bitte was dein Vorposter dir erklärt hat.
-
da habt ihr absolut recht, aber wo in dieser antwort
int k = (this->*funcPointer)(&i);
ist der
funcPointer bla = &foo::TestFunc;
kontext?
-
NullbockException schrieb:
...
funcPointer bla = &foo::TestFunc;
...
Ach, funcPointer ist der Typ. Ich hatte den nämlich wie einen Variablennamen verwendet. Aber dann sieht's halt so aus:
int ergebnis = (this->*bla)(&i);
Zumindest dann, wenn die Funktion auf *this aufgerufen werden soll.
-
Oder analog dazu:
int ergebnis = (Test::*bla)(&i);
Wenns öffentlich sein soll.
MfG