Funktion pointer auf member-Funktionen
-
Hi,
ich weiss das dieses Problem schon oft in Foren besprochen worde, trotzdem komm ich mit diesem einfachen Code Beispiel schon nicht klar.
Hier ist der alte lauffähige Code den ich ersetzen möchte:
#include <cstdlib> #include <iostream> using namespace std; class foo{ public : foo(int sel){ selection = sel; }; int selection; void one(){ cout << "one" << endl; } void two(){ cout << "two" << endl; } void one_or_two(){ if (selection == 1) one(); else two(); } }; /* * */ int main(int argc, char** argv) { foo f(1); f.one_or_two(); return (EXIT_SUCCESS); }Und hier ist der neue Code den ich nicht kompliert bekomme:
#include <cstdlib> #include <iostream> using namespace std; class foo{ public : foo(int sel){ selection = sel; if (selection == 1) one_or_two = one; else one_or_two = two; }; int selection; void one(){ cout << "one" << endl; } void two(){ cout << "two" << endl; } void (*one_or_two)(); }; /* * */ int main(int argc, char** argv) { foo f(1); f.one_or_two(); return (EXIT_SUCCESS); }error: argument of type `void (foo::)()' does not match `void (*)()'
Ich weiss das es daran liegt, dass ich einem normalen Funktions Pointer eine Member-Funktion zuweisen möchte. Und ich könnte das Problem lösen, indem ich stattdessen static Funktionen verwende. Aber für mein (reales) Code Problem, muss ich wirklich member funktionen verwenden.
Was muss ich am Code ändern damit es funktioniert?
Danke für die Zeit zu diesem alten Problem.
-
-
Danke für den Guten Link. Habs jetzt wie folgt geändert und nun ein neues Problem.
Wie kann ich auf den "Member-Function-pointer" meiner Klasse, von aussen zugreifen?
#include <cstdlib> #include <iostream> using namespace std; class foo{ public : foo(int sel){ selection = sel; if (selection == 1) one_or_two = &foo::one; else one_or_two = &foo::two; // (this->*one_or_two)(); }; int selection; void one(){ cout << "one" << endl; } void two(){ cout << "two" << endl; } void (foo::*one_or_two)(); }; /* * */ int main(int argc, char** argv) { foo f(1); (f.*one_or_two)(); return (EXIT_SUCCESS); } error: `one_or_two' was not declared in this scope bei (f.*one_or_two)();
-
Was soll das überhaupt?
Ich würde das eher so machen:
typedef void (foo::*one_or_two)(); // typedef für einfachere Benutzung int main(int argc, char** argv) { foo f(1); one_or_two fp = &foo::one; // funktionszeiger erzeugen (f.*fp)(); // aufrufen return (EXIT_SUCCESS); }
-
Also den member-function-pointer ausserhalb der Klasse deklarieren?
Das eigentliche Programm, das ich verändern möchte, ist natürlich ganz anders und viel Komplexer. Die Sache ist, abhängig von der Initialisierung der Klasse, soll eine bestimmte Member-Funktion der Klasse unterschiedliche Dinge tun. Der Benutzer soll davon aber gar nicht bemerken. Er soll, auf das Beispiel bezogen, immer nur one_or_two() aufrufen und braucht gar nichts von den echten Funktionen (one oder two) wissen.
Klar könnte ich wie im alten Code Beispiel, einfach eine IF-Verzweigung in One_or_two verwenden, aber da sich die Auswahl nach der Initalisierung niemals ändert, und die Funktion one_or_two mehrere tausende Male ausgeführt wird, wollte ich direkt einen Zeiger verwenden, der immer auf die entsprechende (reale Funktion one oder two) zeigt.
-
Wäre vielleicht das Strategy-Entwurfsmuster eine Alternative?