Funktionspointer Fehlermeldung
-
Es gibt einen grundlegenden Unterschied zwischen Funktionen und (nicht-statischen) Memberfunktionen. Die einen werden einfach so aufgerufen:
foo();
Die anderen werden stets in Verbindung mit einem Objekt aufgerufen, was dann über den this-Zeiger verfügbar ist:
obj.bar();
Du versuchst jetzt, die Adresse einer Memberfunktion an einen normalen Funktionspointer zuzuweisen, was wie man sich denken kann, nicht funktionieren kann. Man kann zwar in C++ Memberzeiger definieren, aber das braucht man hier nicht. Mache deine beiden Memberfunktionen einfach statisch:
class test { ... static float ZMedian(Point *a_cPoint,const LTInt &a_iNum); static float ZMean(Point *a_cPoint,const LTInt &a_iNum); };
Das klappt, weil beide Funktionen nicht auf andere (nichtstatische) Klassenmembers zugreifen, und somit theoretisch auch ohne ein Objekt funktionieren können.
-
Hallo,
vielen Dank.Jetzt hab ich ein weiteres Problemchen:
void test::TestFunktionspointer() { float(test::*getZ)(Point *a_cPoint,const LTInt &a_iNum); int Z = 3; if(Z ==3){ getZ = ZMedian; }else getZ = ZMean; // Wie erhalte ich nun mit dem Funktionspointer einen float-Wert??? float t_fZ = getZ(a_cPoint,a_iNum); // so klappt es nicht :-( // Fehlermeldung: Ausdruck ergibt keine Funktion }
-
this->*getZ( ...
aber mit static hast du hier wesentlich weniger Zahnschmerzen
-
Hallo,
o.k. dann mach ich's wohl lieber mit static.
Danke.
-
Bashar schrieb:
this->*getZ( ...
Hier fehlen allerdings noch Klammern:
(this->*getZ)( ...
-
Guten Morgen,
hab noch Probleme mit meinem Funktionspointer
void test::test1() { float(test::*getZ)(Point *a_cPoint,const int &a_iNum); int Z = 3; // geb ich einfach mal so vor if(Z ==3){ getZ = ZMedian; // Fehlermeldung: 'float (__cdecl *)(class Point *,const int &)' kann nicht in 'float (__thiscall test::*)(class Point *,const int &)' konvertiert werden // Es gibt keinen Kontext, in dem diese Konvertierung moeglich ist. }else getZ = ZMean; // hier die gleiche Fehlermeldung Point* t_test; // bestimme ich einfach mal so int Num = 4; float ZWert = (this->*getZ)(t_test,Num); // Mein Programm soll jetzt so schlau sein, dass ich mit (this->*getZ) die richtige Methode anwende und ein float-Wert zurückgegeben wird. }
Was mach ich denn falsch?
-
ga_un schrieb:
Was mach ich denn falsch?
Bashar schrieb:
Du versuchst jetzt, die Adresse einer Memberfunktion an einen normalen Funktionspointer zuzuweisen, was wie man sich denken kann, nicht funktionieren kann.
-
Hallo,
bitte einen Tipp, wie ich das schreiben kann???
getZ = this->ZMean; //? getZ[0] = this->ZMean; //? //....
-
Hallo,
hab's jetzt gecheckt, es funktioniert so (muss kein static Member deklarieren):
class test { public: void test1(); private: float ZMedian(Point *a_cPoint,const LTInt &a_iNum); float ZMean(Point *a_cPoint,const LTInt &a_iNum); };
void test::test1() { float(test::*getZ)(Point *a_cPoint,const int &a_iNum); int Z = 3; if(Z ==3) getZ = ZMedian; else getZ = ZMean; Point* t_test; int Num = 4; float ZWert = (this->*getZ)(t_test,Num); }
-
Probier mal
getZ = &ZMean;
oder
getZ = &test::ZMean;
BTW was ist aus der static-Idee geworden? Ich hoffe mal du willst nur Memberpointer ausprobieren und die hier nicht tatsächlich benutzen ...
-
Ich wollte Memberpointer ausprobieren.
Ausserdem hab ich ne Schleife, die bis zu 2Mio.x durchgeführt wird. In der hatte ich drei Abfragen: soll Min/Max/ od. Median berechnet werden. Damit in der Schleife die drei if-Abfragen entfallen, wollte ich Memberpointer einsetzen ...
-
Nee, ursprünglich wolltest du mit Funktionspointern arbeiten. Wenn ich dich mal auf dein erstes Posting hinweisen darf ...
-
In deinem Code wird immer nur der Median berechnet.
mfg
v R
-
Unabhaengig zum speziellem Thema: Hier gibt es ein wirklich nettes Tutorial fuer Funktionszeiger: (sinnigerweise) www.function-pointer.org.