Zeiger auf Memberfunktionen
-
Folgende Ausgangssituation:
Ich habe mehrere unterschiedliche Klassen, in denen es jeweils mehrere Funktionen der selben art gibt "bool funktion(void)".
Zu Beginn des Programms soll dann festgelegt werden welche Funktionen dann im weiteren Verlauf immer wieder benutzt werden sollen. Dazu existiert ein Array aus Funktionszeigern auf eben jene Art von Funktionen "bool funktion(void)".Mein Problem ist allerdings, dass mir nicht klar war, dass man keine Pointer auf Memberfunktionen setzen darf. Bzw., dass man dazu den Typ der Klasse, aus der die Funktion stammt schon vorher definieren muss:
bool (CKlasse1::* newfunc)(void)Meine Frage jetzt: Wie würdet ihr dieses Problem lösen?
MFG
Ace
-
kanns leider nicht sagen, wie ich das machen würde. hängt sehr vom rest des programms ab.
vielleicht virtuelle funktionen und bool (Basisklasse::* newfunc)(void)
-
Geht das denn, wenn ich die Methoden dann letztlich erst in der abgeleiteten Klasse definiere?
Muss ich dann bei der zuweisung casten?
bool (Basisklasse::* newfunc)(void)newfunc = &((Basisklasse)objekt_der_vererbten_klasse).funktion()MFG
Ace
-
AceKiller73 schrieb:
Mein Problem ist allerdings, dass mir nicht klar war, dass man keine Pointer auf Memberfunktionen setzen darf. Bzw., dass man dazu den Typ der Klasse, aus der die Funktion stammt schon vorher definieren muss:
bool (CKlasse1::* newfunc)(void)Was nur logisch ist, da man für nicht-statische Memberfunktionen 2 Zeiger benötigt: a) Den der Methode, b) den des Objektes (Das was in der Methode als this bekannt ist).
Eine Lösung sind beispielweise Funktoren (Funktionsobjekte). Dies ist aber auch schon ein komplexeres Thema, ich verweise hier mal auf die Boost-Bibliothek oder den TR1:
* boost::function, std::tr1::function
Üblicherweise in Kombination mit
* boost.:bind, std::tr1::bindcu André
-
Ja auf die Boost libary bin ich auch schon gestoßen. Kam mir alles aber bischen kompliziert vor.
Ich werds mit Polymophie versuchen.
Danke
MFG
Ace
-
AceKiller73 schrieb:
Ich werds mit Polymophie versuchen.
Das klappt aber dennoch nur, wenn du die Funktion auf einen konkreten Zeiger auf das Objektes anwendest. Ich hoffe soweit hattest du meinen Post schon gelesen...
P.S: Wenn du MSVC besitzt gibt es für Boost auch einen Installer...