Funktionszeiger
-
Hallo zusammen, ich hätte da mal ein Problem. Ich habe 2 Klassen und ich möchte funktion A aus Klasse A an Funktion B aus klasse B geben. Ich habe mir schon nen Wolf gesucht bin aber noch nicht fündig geworden und hoffe jetzt hier auf eine Antwort. Jetzt aber erstmal der Code zum besseren Verständniss meines Problems:
Server.h
namespace Servers { class Server : public ServerBase { public: void OnFrame(Decoder decode); } }
Decoder ist in ServerBase definiert als
typedef void (*Decoder)(Packet*);
namespace Servers { void Server::OnFrame(Decoder decode) { Packet* p; decode(p); } }
Manager.h
namespace Managers { class Manager { public: void OnFrame(); protected: void DecodeFunc (Packet* p); Servers::Server* svr; } }
namespace Managers { void Manager::OnFrame() { void (Manager::*Decode)(Packet*) = &Manager::DecodeFunc; this->svr->OnFrame(Decode); } void DecodeFunc (Packet* p) { // irgend nen voodoo } }
Momentan hat der Compiler mit folgender Zeile ein Problem .... und somit auch ich :).
this->svr->OnFrame(Decode);
Ich hoffe dass ich mein Anliegen deutlich machen konnte. Weiss jemand wie ich diesen Funktionszeiger übergeben muss?
-
RollSplitt schrieb:
Ich hoffe dass ich mein Anliegen deutlich machen konnte. Weiss jemand wie ich diesen Funktionszeiger übergeben muss?
Zum Glück ist der Fehler bekannt, sonst hätte mindestens noch die Kompilerfehlermeldung gefehlt. Wieso die Leute diese immer weglassen, ist mir ein absolutes Rätsel.
Funktionszeiger und Member-Funktionszeiger sind zwei unterschiedliche Dinge. Ein Member-Funktionszeiger braucht zusätzlich eine Instanz, auf welcher die Funktion aufgerufen werden soll. Siehe auch FAQ ganz am Ende:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39450.htmlFür allgemeine "Funktionszeiger" gibt es verschiedene Hilfskonstrukte. Zu nennen sollten wohl sicherlich
boost::function
undboost::bind
sein.Grüssli
-
Erstmal danke für die Antwort. Ich muss dir aber gestehen dass mir deine Antwort nicht weitergeholfen hat ... solche beispiele habe ich auch zu Hauf im Netz gefunden.
Wie dem auch sei. Ich habe jetzt eine Lösung gefunden. Der Chef-Progger bei uns hat für uns Delegates (nach einer Vorlage aus dem Netz) nachprogrammiert und mit Hilfe davon habe ich es geschafft die Methode an den Server zugeben.
Eine weitere Möglichkeit wäre noch die Funktion im Manager static zu machen was aber wieder zu anderen Probleme führt.
Die Vorlage zum Delegate-Kram findet man hier.: http://www.codeproject.com/KB/cpp/ImpossiblyFastCppDelegate.aspx
-
RollSplitt schrieb:
Die Vorlage zum Delegate-Kram findet man hier.: http://www.codeproject.com/KB/cpp/ImpossiblyFastCppDelegate.aspx
Das ist eine Sparversion (sparsam im positiven wie im negativen Sinne) von
boost::bind
.