Function pointer mit typedef + vererbung
-
Hi,
ich brauch wieder hilfe ich bin zu dumm für funktionspointer.
Mein Ziel: eine abstrakte klasse die im konstruktor einen funktionspointer als callback entgegennimmt und mehrere implementierungen die dann diese funktion aufrufen bei bedarfich habe mir die syntax für den typedef für einen funktionspointer aus QT kopiert, darum weiß ich nicht ob die richtig ist und wär froh wenn mir jemand die syntax erklären könnte:
typedef void(*InputListener)(EventType type, int data1, int data2);
InputListener soll der name sein, EventType ist ein enum
Dann hab ich meine oberklasse:class AbstractInputListener { protected: InputListener listener; public: AbstractInputListener(InputListener _listener) : listener(_listener) { } };
und eine unterklasse:
class WindowsInputListener : public AbstractInputListener { public: WindowsInputListener(InputListener listener) : AbstractInputListener(listener) { } };
und versuche sie in einer dritten klasse zu benutzen:
h:private: AbstractInputListener* input; public: void inputEvent(EventType type, int data1, int data2);
cpp:
#ifdef WIN32 input = new WindowsInputListener(inputEvent); #else qDebug("muss auf windows laufen :("); #endif void MeineKlasse::inputEvent(EventType type, int data1, int data2){ qDebug("event: %d", type); }
ergebnis:
error: no matching function for call to `WindowsInputListener::WindowsInputListener(<unknown type>)'
WindowsInputListener.h:6: note: candidates are: WindowsInputListener::WindowsInputListener(const WindowsInputListener&)
WindowsInputListener.h:9: note: WindowsInputListener::WindowsInputListener(void (*)(EventType, int, int))warum klappt das so nicht? danke!
- peter
-
Weil eine Memberfunktion und eine freie Funktion zwei unterschiedliche Dinge sind. Eine Memberfunktion braucht immer noch ein Objekt zum Aufrufen, weil es ein versteckes Objekt Argument hat.
Wenn du allgemeine Callbacks verwenden, also dich nicht nur auf freie Funktionen beschränken willst, dann solltest du dir vor allem mal
boost::function
und vielleicht nochboost::bind
anschauen. Beides ist glaub ich auch im TR1 vorhanden.Grüssli
-
ach gott, stimmt natürlich, danke.
Kann mir noch jemand die syntax von dem typedef erklären? Ich kannte das bisher nur als
typedef AlterTyp NeuerName
?
danke
-
anfängerpeter schrieb:
Mein Ziel: eine abstrakte klasse die im konstruktor einen funktionspointer als callback entgegennimmt und mehrere implementierungen die dann diese funktion aufrufen bei bedarf
Warum nimmst Du keinen Functor?