Hallo,
mal wieder eine Programmierfrage. Das "Codebeispiel", das ich dazu hier habe, ist etwas kryptisch und mein Stroustrup schweigt sich darueber aus.
Folgendes Problem: Ich habe Klassen, die alle von einer Klasse Object abgeleitet sind (die kann ich in meinem Szenario nicht aendern). Nun moechte ich, dass diese Klassen bestimmte Funktionen als Callback-Funktionen registrieren lassen.
typedef bool (callb_func)(std::string);
bool register_callback(Object* obj, callb_func myfunc);
Ich speichere die callbacks ab und moechte sie jetzt, ohne zu wissen, welche Klasse sich unter "obj" verbirgt , ausfuehren. Das sollte in etwa so gehen:
obj->myfunc(mystring);
Der Compiler beschwert sich jetzt, dass Object keine Funktion vom Typ callb_func hat. Kann ich dieses callback Schema trotzdem irgendwie einsetzen? Mit irgendeiner speziellen Syntax oder einem Hack?
cu, Ulf
On Mon, Dec 02, 2002 at 09:35:01PM +0100, Ulf Lorenz wrote:
Hallo,
Hi Ulf,
Der Compiler beschwert sich jetzt, dass Object keine Funktion vom Typ callb_func hat.
Zu recht, da die BasisKlasse keine solchen Methoden zur Verfügung stellt.
Kann ich dieses callback Schema trotzdem irgendwie einsetzen? Mit irgendeiner speziellen Syntax oder einem Hack?
Du müsstest noch eine WrapperKlasse schreiben, die von Object abgeleitet ist und von der die anderen Klassen abgeleitet werden (nennen wir sie MyObject).
Diese Klasse hat die Methode zum Registrieren der CallBacks und eine Methode runCallBack(), die den CallBack aufruft. Nun kannst du auf alle abgeleiteten Klassen
myObject->runCallBack();
aufrufen.
Ciao, Tobias
On Mon, Dec 02, 2002 at 10:59:31PM +0100, Tobias Koenig wrote:
Kann ich dieses callback Schema trotzdem irgendwie einsetzen? Mit irgendeiner speziellen Syntax oder einem Hack?
Du müsstest noch eine WrapperKlasse schreiben, die von Object abgeleitet ist und von der die anderen Klassen abgeleitet werden (nennen wir sie MyObject).
Diese Klasse hat die Methode zum Registrieren der CallBacks und eine Methode runCallBack(), die den CallBack aufruft. Nun kannst du auf alle abgeleiteten Klassen
myObject->runCallBack();
aufrufen.
Aha, es geht also nicht ohne. Danke fuer die Hinweise. Ich werde also vermutlich doch libsigc++ verwenden, selbst wenn das eine zusaetzliche lib ist...
Ciao, Tobias
Ulf
Am Dienstag, dem 03. Dezember 2002 um 23:25:10, schrieb Ulf Lorenz:
Aha, es geht also nicht ohne. Danke fuer die Hinweise. Ich werde also vermutlich doch libsigc++ verwenden, selbst wenn das eine zusaetzliche lib ist...
Kennst du Boost.Signals? Es gibt dort einen Vergleich mit libsigc++ und .NET delegates. Meines Erachtens ist Boost.Signals das bisher beste für C++.
Torsten
On Tue, Dec 03, 2002 at 11:47:31PM +0100, Torsten Werner wrote:
Am Dienstag, dem 03. Dezember 2002 um 23:25:10, schrieb Ulf Lorenz:
Aha, es geht also nicht ohne. Danke fuer die Hinweise. Ich werde also vermutlich doch libsigc++ verwenden, selbst wenn das eine zusaetzliche lib ist...
Kennst du Boost.Signals? Es gibt dort einen Vergleich mit libsigc++ und .NET delegates. Meines Erachtens ist Boost.Signals das bisher beste für C++.
danke, mal schauen...
Torsten
cu, Ulf
Am Montag, dem 02. Dezember 2002 um 21:35:01, schrieb Ulf Lorenz:
Ich speichere die callbacks ab und moechte sie jetzt, ohne zu wissen, welche Klasse sich unter "obj" verbirgt , ausfuehren. Das sollte in etwa so gehen:
obj->myfunc(mystring);
Der Compiler beschwert sich jetzt, dass Object keine Funktion vom Typ callb_func hat.
Entweder musst du die Funktion auch als virtuelle Funktion zur Basisklasse hinzufügen oder die änderst die Hierarchie so, dass zwischen Basisklassen und abgeleiteten Klassen eine Hilfsklasse (Caller) eingeführt wird oder du arbeitest mit Mehrfachvererbung und rufst den Callback über einen crosscast auf:
dynamic_cast<Caller*>(obj)->myfunc(mystring);
Außerdem gibt es noch das Visitor-Pattern, bei dem du die Klassenhierarchie unter Umständen gar nicht mehr ändern brauchst...
Torsten
lug-dd@mailman.schlittermann.de