Hallo, danke. Der springende Punkt war die Deklaration des Funktionszeigers als Membervariable
void (*mFunc)(int);
und
Funktionszeiger dereferenzieren: (*mFunc)( e ); Das hatte ich zwar schon mal probiert, aber hatte nicht geklappt, weil die Deklaration nicht stimmte.
Grüße Stefan On 21 Mar 2003 at 13:38, Bodo Kaelberer wrote:
Hi
ich würde gerne eine Callback-Funktion deklarieren. Sie soll im Konstruktor übergeben werden und die Funktion aufrufen, wenn ein Ereignis eintritt. Etwa so
class A { public: A(void(*func)(int i)) { mFunc = func; }
event(int e) {
Kein Rueckgabetyp. Ich nehme mal void.
mFunc(e); // so geht es nicht
Funktionszeiger dereferenzieren: (*mFunc)( e );
}
private: void* mFunc;
Das ist ein Zeiger auf void. Du brauchst einen Zeiger auf eine Funktion, die ein int als Parameter nimmt:
void (*mFunc)(int);
};
class B { B() { A(callback);
Das ist ein Aufruf eines Funktion namens A(int) und nicht das Erzeugen eines Objektes. Nimm:
A a( callbnnack );
In B braeuchtest Du wahrscheinlich auch noch eine Referenz auf das erzeugte A-Objekt. Sonst kannst Du ja mit A nichts machen und auch die Funktion event() nicht aufrufen.
}
Achtung: Konstruktor ist privat!
static void callback(int e) { cout << e << endl; } };
Ich konstruiere also ein Objekt der Klasse B. Wenn dann die Funktion event abgearbeitet wird, soll sie die callback-Funktion aufrufen. So wie ich es hier beschrieben habe, klappt es nicht (siehe Kommentar).
Fraglich ist fuer mich noch, ob man ueberhaupt einen Zeiger auf callback korrekt erzeugen kann. Es ist zwar eine statische Funktion, aber dennoch eine Member-Funktion der Klasse B. Und irgendwie hab ich ihm Kopf, dass man Zeiger auf Member-Funktionen nicht so einfach verwenden kann. Kannst Du ja mal ausprobieren.
-- | Bodo Kaelberer | http://www.webkind.de/ | http://www.mehr-demokratie-wagen.de/ ---- | Haben oder Nichts sein
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-programming-unsubscribe@suse.com Um eine Liste aller verfügbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-programming-help@suse.com