C++ Methode als Callback-Funktion übergeben



  • Es geht mir prinzipiell erstmal beispielhaft um eine Methode:

    void Ludo::mouseDolly(int x, int y) {
    }
    

    Diese Methode soll als Callback an eine Funktion aus OpenGL übergeben werden:

    glutMotionFunc (&mouseDolly);
    

    Das funktioniert so natürlich nicht, da ich dort dann die Fehlermeldung bekomme, dass void (Ludo::)(int, int) nicht nach void ()(int, int) gecastet werden kann.

    Hab es nun bereits schon mit functoren probiert:

    class LudoMouseFunctor {
    public:
      LudoMouseFunctor(Ludo* _pt2Obj=0, void(Ludo::*_func)(int x, int y)=0) {
        pt2Obj = _pt2Obj;
        func=_func;
      }
      void operator() (int x,int y) {
        (*pt2Obj.*func)(x,y);
      }
    
    private:
      Ludo *pt2Obj;
      void (Ludo::*func)(int, int);
    };
    

    Es klappt auch in der Hinsicht, dass ich über diesen Functor die Methoden aufrufen kann, aber als Callback-Funktion übergeben kann ich es trotzdem nicht... egal wie ich es versuche. Bekomme dabei folgende Fehlermeldung:

    ludo.cpp:352: Fehler: »Ludo::LudoMouseFunctor« kann nicht nach »void (*)(int, int)« für Argument »1« nach »void glutMotionFunc(void (*)(int, int))« umgewandelt werden
    

    Sind Functoren hier generell ein falscher Ansatz? Oder hat sich hier einfach nur ein Fehler eingeschlichen und ich rufe das ganze falsch auf? Wie muss ich es dann anwenden?

    Bin für Hilfe sehr dankbar ^^



  • Hallo

    als Callback-Funktion wird eine statische Funktion erwartet, keine Membermnethode einer Klasse (weil dort als zusätzlicher Parameter this vorhanden ist).

    bis bald
    akari



  • Genau deswegen hab ich ja gefragt, wie es gehen würde....
    Eine statische Funktion kann ich nicht nutzen, da dann die Funktionen, die in mouseDolly stehen, nicht am Objekt ausgeführt werden können. Von daher entfällt das.

    Eine Idee, was man sonst machen könnte?



  • Was akari Dir damit vermutlich sagen wollte:

    Du musst eine statische (oder globale) Funktion verwenden.



  • Wie schon die Vorredner erklärt haben, geht der Callback-Mechanismus nur mit statischen Memberfunktionen (woher soll glut sonst wissen, auf welchem Objekt es arbeiten soll ;)). Aber du kannst dir ja auf anderem Weg ein Objekt besorgen, dessen Elemente du dann nutzt (z.B. (statische) Variable in der Methode oder statisches Element der Klasse).



  • Mal angenommen, Deine Klasse wäre ein Singleton. Dann kann sie problemlos auch die statische Methode bekommen und mit getInstance alle Aufrufe weiterleiten. Kannes mehrere Objekte geben, dann geht das natürlich auch nicht.

    Viele Callbacks bieten die Möglichkeit, benutzerdefinierte Daten bei jedem Aufruf mitübergeben zu lassen. Dann kannst Du den this-Pointer als solches Datum mitangeben. Und in der statischen Methode den Aufruf an das Objekt, dessen Pointer Du gekriegt hast weiterleiten.



  • Wie sieht es aus mit einer statischen globalen Funktion, die die Funktion der Callback-Funktion übernimmt.
    Diese greift hierbei auf einen Pointer auf das Objekt und einen Pointer auf die entprechende Methode zurück und leitet somit die Funktionalitäten weiter. Machbar oder nicht?



  • Ja klar geht das. Ist doch ähnlich wie das, was ich beschrieben habe. Um die Zugehörigkeit dieser Weiterleitungsroutine zur Klasse zu kennzeichnen könntest Du Dir überlegen, sie als statische Methode mit aufzunehmen.


Anmelden zum Antworten