Functionpointer auf Memberfunktion in Funktion übergeben.
-
Ich möchte eine Funktionszeiger (Komponente der Klasse "Befehl"), der auf eine Memberfunktion der KLasse "Verwaltung" zeigt,
class Befehl { public: void (Verwaltung::*functionPointer)(); };
als Parameter einer anderen Funktion in "Verwaltung" verwenden. In dieser Funktion wird der functionPointer entsprechend dem
Übergabe wert gesetzt.void Verwaltung::aufnahme(void (*fP)())) { Befehl befehl; befehl.functionPointer = &fp; }
Der Funktionsaufruf befindet sich in einer anderen Funktion in "Verwaltung" und sieht folgendermaßen aus:
aufnahme(&functionName);
Es funktioniert allerdings nicht. Was mache ich falsch?
Ich hab bisher leider auch kein gutes Tutorial für die Verwendung von Funktionszeigern gefunden.
-
Du kannst doch nicht einfach irgendeinen Funktionszeiger in einen Methodenzeiger umwandeln. Befehl hat ein Attribut, für das klar gilt, dass es eine Memberfunktion der Klasse Verwaltung sein soll. Also sollte das auch der Parametertyp der Aufnahme-Methode sein und solch etwas solltest Du auch übergeben. Und bei deiner aufnahme-Methodendefinition ist ein ) zu viel im Kopf.
-
Was heißt "funktioniert nicht"?
Du mußt unterscheiden zwischen einem Funktionspointer (verweist auf eine Funktion) und einem Methodenpointer (verweist auf eine Klassenmethode und verarbeitet noch den implziten this-Parameter). Die können nicht ineinander umgewandelt werden, also mußt du auch einen Methodenzeiger an die aufnahme() übergeben.
-
ester schrieb:
Es funktioniert allerdings nicht. Was mache ich falsch?
Ich hab bisher leider auch kein gutes Tutorial für die Verwendung von Funktionszeigern gefunden.Zuallererst machst du folgendes falsch: Du schreibst einfach "funktioniert nicht", statt eine Fehlermeldung anzugeben.
Dann ist dein Fehler, dass Verwaltung::aufnahme keinen Memberfunktionspointer auf eine methode von Verwaltung sondern einen normalen Funktionspointer als Parameter erwartet. Dann funktioniert die Zuweisung natürlich auch nicht.
Tutorials/FAQs zu Funktionspointern gibts zu Hauf:
http://www.parashift.com/c++-faq-lite/pointers-to-members.html, vor allem Punkt 33.5 behandelt (vermutlich) dein Problem.
-
Schau mal unter http://www.parashift.com/c++-faq-lite/pointers-to-members.html
Da findest Du eine gute Erklärung und auch Beispiele.
edit: uups, zu spät^^
-
Danke für die schnellen Antworten!
Ich habe das Programm jetzt entsprechend geändert.
Jetzt kommt allerdings noch die Fehlermeldung:"Verwaltung" has not been declared
bei der Deklaration des "functionPointers" in der KLasse Befehl.
Woran kann das liegen ?
(ich habe die datei Verwaltung.h oben eingebunden.)
-
ester schrieb:
Danke für die schnellen Antworten!
Ich habe das Programm jetzt entsprechend geändert.
Jetzt kommt allerdings noch die Fehlermeldung:"Verwaltung" has not been declared
bei der Deklaration des "functionPointers" in der KLasse Befehl.
Woran kann das liegen ?
(ich habe die datei Verwaltung.h oben eingebunden.)Hast du? Zeig mal welche Datei du wo einbindest - oder schau dir deine includes selber mal durch. Häufig kommt das vor, wenn man Ring-Includes hat, Beispiel:
A.h includiert B.h und benutzt den Namen aus B.h
B.h includiert A.h
B.cpp includiert B.hFolge: in der Übersetzungseinheit von B wird B.h eingebunden, dann direkt A.h eingebunden, der bindet nochmal B.h ein, was aber keinen Effekt hat, da der Includeguard von B.h bereits definiert ist. Dann benutzt der Header von A.h die Namen aus B.h, ohne dass die schon bekannt sind. Fehler!
Die Lösung sind Vorwärtsdeklarationen (engl: forward declaration)