Callback mit Memberfunktionen einer Instanz



  • Hallo.
    Ich habe derzeit ein Vorhaben, in dem ich gerne Callback für Memberfunktionen einbauen würde.
    Das ganze funktioniert momentan über statische Funktionen:

    typedef void (*Callback)(const char*);
    
    void TestCallback(const char *sName)
    {
    	cout << sName << endl;
    }
    

    Das ganze klappt auch wunderbar. Ich übergebe meiner Funktion, die irgendwann einen Callback absetzen soll die Funktion so:

    MeineFunktion("bla", TestCallback);
    
    // Der Prototype:
    void MeineFunktion(const char *sName, Callback cCallback);
    
    // Aufruf:
    cCallback(sName);
    

    Ich wollte das ganze jetzt aber gerne für Memberfunktionen einrichten, die eine Instanz besitzen. Die "MeineFunktion"-Funktion rufe ich aus dem Konstruktor der Klasse auf. Also würde ich das gerne so machen:

    cKlasse::cKlasse(void)
    {
        MeineFunktion("bla", this->TestCallback);
    }
    

    Aber das funktioniert anscheinend nicht so einfach, wie ich mir das vorgestellt habe. Gibt es eine Möglichkeit, dass doch zu bewerkstelligen?

    Danke!
    ~ Chris


  • Administrator

    FAQ:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39450.html

    Für allgemeine Callbacks gibt es Möglichkeiten von Boost:
    http://www.boost.org/doc/libs/1_38_0/doc/html/function.html
    http://www.boost.org/doc/libs/1_38_0/libs/bind/bind.html

    Ist glaub ich auch im TR1 enthalten:
    `std::tr1::function

    std::tr1::bind`

    Und wird ganz sicher in C++0x enthalten sein.

    Grüssli





  • Hi.
    Danke mal für die vielen Links.
    Im Prinzip scheint es dann ja doch einfach, wäre nicht das Problem mit den mehreren verschiedenen Klassen, was diese einfache Lösung zunichte macht.
    Die Boost-Sache gefällt mir auch nicht so, wollte auf externe Header eigentlich verzichten.

    Soweit ich das gesehen habe gibt es dann keine andere Möglichkeit mehr 😕
    Schade.

    Danke trotzdem!
    ~ Chris


  • Administrator

    theliquidwave schrieb:

    Die Boost-Sache gefällt mir auch nicht so, wollte auf externe Header eigentlich verzichten.

    Boost kann man als Erweiterung der Standardbibliothek sehen und die Standardbibliothek verwendest du ja auch 😉
    Man kann ja auch statisch linken, dann musst du keine DLLs oder ähnliches weitergeben. Wobei ich jetzt nicht mal weiss, ob Boost.Bind und Boost.Function nicht nur aus Header Dateien bestehen. Dann musst du gar nichts zusätzliches dazulinken.

    theliquidwave schrieb:

    Soweit ich das gesehen habe gibt es dann keine andere Möglichkeit mehr 😕

    Ehm, doch, die TR1 Möglichkeit. Viele der modernen Kompiler unterstützen heutzutage TR1.

    Als letzte Alternative wäre auch noch, dass du die Sache selber implementierst. So viel arbeit ist es nicht wirklich. Aber wieso du überhaupt auf externe Header verzichten willst, ist mir ein wenig ein Rätsel.

    Grüssli



  • Hi.
    Nichts spricht gegen externe Header. Nur ich bin noch nicht so lange in C++ dabei und kenne mich nicht deshalb nicht so damit aus, wie man sich mit so etwas auseinander setzt 😉
    Da ich MSVC++ benutze sollte die TR1-Methode wohl auch funktionieren, wenn dann werde ich diese benutzen. Muss mich aber erst einmal damit auseinandersetzen und ein paar Beispiele bei Google suchen.

    Danke nochmals 😃
    ~ Chris


Log in to reply