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*);
    

    Server.cc

    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;
    }
    }
    

    Manager.cc

    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?


  • Administrator

    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.html

    Für allgemeine "Funktionszeiger" gibt es verschiedene Hilfskonstrukte. Zu nennen sollten wohl sicherlich boost::function und boost::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 .


Log in to reply