Callback-Funktion



  • Ja, jetzt hast Du mich richtig verstanden. Und wenn ich Dich und Deinen Quelltext richtig verstanden habe, weiß ich jetzt auch, wo mein Fehler liegt. Aber bei Deiner Lösung kann ich als Callback-Funktion nur Member-Funktionen von A einsetzen, oder? (Das würde mir für den Augenblick auch schon reichen.)



  • Wenn du allerdings in B nicht nur Memberfunktionen von A verwenden willst (dazu bräuchtest du dann auch immer ein Objekt zum Ausführen), bleibt dir noch die Wahl:
    Mach MyIntegerfunktion global, oder packe sie in einen Namensbereich, dann hat sie die gewünschte Signatur void (*)(int)
    Mach sie static. Dann hat sie ebenfalls die gewünschte Form:

    Klasse B, Header:
    class B
    {
    public:
    void CallbackFunktion(int);
    void SetzeCallbackFunktion(void (*InFunktion)(int));
    };
    
    Klasse B, Quelltext:
    void B::SetzeCallbackFunktion(void (*InFunktion)(int))
    {
    this->CallbackFunktion = InFunktion;
    }
    
    Klasse A, Header:
    class A
    {
    public:
    void AufrufSetzeCallback();
    static void MyIntegerFunktion(int InInt); //static gemacht
    
    B MyB;
    };
    
    Klasse A, Quelltext:
    void A::MyIntegerFunktion(int InInt)
    {
    }
    
    void A::AufrufSetzeCallback()
    {
    MyB.SetzeCallbackFunktion(MyIntegerFunktion);
    }
    


  • Ihr wisst aber schon, daß man in C++ Callbacks eigentlich anders implementiert???

    Den vorgestellten Weg wählt man eigentlich nur (noch), wenn eine C-API dies in einer solchen Form fordert.



  • drei Fragezeichen???
    der OP wollte doch einen Funktionszeiger?!



  • Marc++us schrieb:

    Ihr wisst aber schon, daß man in C++ Callbacks eigentlich anders implementiert???

    und wie macht man das??



  • überschreiben virtuelle methoden.



  • Davies Vorschlag ist angenommen, die Methode wird jetzt static. Vielen Dank auch an alle anderen.



  • Die Methode ist jetzt doch nicht static, da sie von mehreren Instanzen der Klasse verwendet werden soll. Mein Programm folgt jetzt entelechies Vorschlag von 16:29:18 12.08.2003, also dem Vorschlag, die Callback-Funktion mit einem A:: davor zu deklarieren.

    Aber wie rufe ich dann schlussendlich die Callback-Funktion B.callbackFunktion auf? Schreibe ich B.callbackFunktion, erhalte ich die Meldung, B.callbackFunktion sei keine Funktion.



  • dann macht man es so:

    class Test
    {
    private:
      int value;
    
      void callbackImpl()
      {
        cout<<value;
      }
    public:
      Test(int value) : value(value) {}
    
      static void callback(Test* self)
      {
        self->callbackImpl();
      }
    };
    

    der this-Zeiger muss ja irgendwo herkommen.

    denn vergiss nicht:

    von der logik her ist
    f.foo() == foo(&f)



  • Du hast void callbackImpl(), ich habe void A::callbackImpl().

    Und meinst Du mit self this?


Anmelden zum Antworten