Functions Pointer in Classen nutzen
-
Hallo zusammen,
ich sitze gerade vor einem kleinen Problem und sehe glaub ich den Wald vor Bäumen nicht
und komme einfach nicht weiter. Ich habe schon einiges ausprobiert und im I-Net gesucht aber nichts Passendes gefunden :(.Ich möchte gerne in einer Parent Klasse ein z.B. Event Deklarieren und nutzen (siehe class TParent).
Der Funktion soll in der nachfolgenden Klasse eine Function Pointer zugewiesen werden.
Wenn in der Parent Klasse nun die Funktion TestFunc() aufgerufen wird,
soll geprüft werden ob OnEvent ein Function Pointer zugewisen wurde und sollte es so sein diese gecallt werden.Im Constructor der Master Klasse soll in diesem Beispiel dem OnEvent der Parent Klasse die Funktion OnGetEvent zugewiesen werden.
Leider komme ich genau hier nicht mehr weiter. Irgendwie hab ich hier ein dicken Denkfehler...
Hier mal ein kleines einfaches Beispiel wie ich mir das ungefähr vorstelle:
class TObject{ //... }; typedef void (*TNotifyEvent)(TObject *Sender); class TParent: public TObject{ public: TNotifyEvent OnEvent; void TestFunc(){ if (OnEvent) { OnEvent(this); }; }; }; class TMaster: public TParent{ public: void OnGetEvent(TObject *Sender){}; TMaster(){ OnEvent = &TMaster::OnGetEvent; }; };Ich hoffe jemand hat eine Idee, wie ich das umsetzen kann.
-
Ich verstehe nicht, was du machen willst, und ich glaube dein Beispiel zeigt auch nicht das echte Problem.
Im Codebeispiel würde ich onEvent einfach als virtuelle Funktion definieren.
Grundsätzlich: für Memberfunktionen benötigt man Memberfunktionspointer und man muss sie auch immer mit einem Objekt für this versorgen. Alternative: std::function und Lambda.
-
Hallo coly,
möchtest du die VCL (Delphi/Borland C++ Builder/RAD Studio) nachbauen (deine Klassennamen sehen so aus)?
Das mit den Methodenzeigern wird schwierig, denn dafür gibt es beim BCB das zusätzliche Schlüsselwort __closure.
Aber schau auch mal in Borland style __closure in gcc.
-
Hallo Th69,
ja, im prinziep ähnlich dem Delphi von der Logic her.
Hab nach zich Seiten lesen aber auch schon die Problematik festgestellt.
Die meisten nutzen irgendwelche Hacks oder Modifizieren den Compiler./coly
-
Im C++Builder heisst das Schlüsselwort closure.
Das sollte sich aber mit bind nachbauen lassen (vor C++14 boost::bind).