Zeiger auf Objektmethode übergeben...?



  • Hallo,
    ich habe schon die Suche bemüht, aber es klappt so nicht und ich sehe vielleicht den Wald vor lauter Bäumen nicht...jedenfalls bin ich jetzt vor lauter * und & ziemlich durcheinander. Vielleicht kann mir ja jemand den entscheidenden Hinweis geben:

    **Wie übergebe ich einen Zeiger auf eine Objektmethode?
    **
    Ich rufe glutDisplayFunc(void (*func)(void)) auf.
    Die zu übergebene *func steckt aber in einem Objekt "test": test.display();

    Alle Varianten, die ich mir so logisch vorstellen konnte, haben nicht geklappt.
    z.B.

    &test::display, *test::display, &test.display, *test.display
    

    Man merkt wohl, dass ich mit diesem ganzen gezeigere und refenrenze noch etwas wacklig bin... 😞

    Wie denn nu?
    Danke scho'mal!



  • Gar nicht. Muss ne statische Memberfunktion sein.



  • Manno 😞
    Danke Dir, das ging ja fix. Das hatte ich ein wenig "befürchtet"...
    Naja, ich verpacke den Aufruf jetzt erstmal in eine statische Funktion und mach das später schön...



  • Was willst du genau machen?



  • Du musst zusätzlich noch einen Zeiger auf die bestimmte Instanz übergeben.
    Beispiel:

    #include <iostream>
    
    struct Widget
    {
        void Foo() { std::cout << "Hallo!"; }
    };
    
    void Bar(Widget* w, void (Widget::*f)())
    {
        (w->*f)();
    }
    
    int main()
    {
        Widget w;
        Bar(&w, &Widget::Foo);
    }
    

    Oder auch mit boost:

    #include <iostream>
    #include <boost/function.hpp>
    
    struct Widget
    {
        void Foo() { std::cout << "Hallo!"; }
    };
    
    void Bar(Widget* w, boost::function<void (Widget*)> f)
    {
        f(w);
    }
    
    int main()
    {
        Widget w;
        Bar(&w, &Widget::Foo);
    }
    

    mfg.



  • weisseruebe schrieb:

    Manno 😞
    Danke Dir, das ging ja fix. Das hatte ich ein wenig "befürchtet"...
    Naja, ich verpacke den Aufruf jetzt erstmal in eine statische Funktion und mach das später schön...

    Ich denke nicht das man da noch was schön machen kann. glutDisplayFunc ist dafür zu beschränkt.



  • Ui...

    Na ich bastel gerade mit OpenGL rum und will das ganze halt objektorientiert machen (und dabei gleich C++ lernen)
    Das Grundprinzip der oo kenne ich an sich schon ganz gut dank Java.

    Konkret möchte ich bei der fertigen glutDisplayFunc halt einen Zeiger auf die Methode Display im Objekt test übergeben.
    Aber woran sehe ich, dass *func da statisch sein muss?
    Kann das glutDisplayFunc nicht egal sein?



  • lösung schrieb:

    Ich denke nicht das man da noch was schön machen kann. glutDisplayFunc ist dafür zu beschränkt.

    Na ich muss ja nur die Klasse des Objektes test so basteln, dass die beiden Methoden static sind.
    Das ist mir jetzt aber gerade etwas viel, zumal noch ne Menge anderes fertig werden muss. Aber ich will es halt auf lange Sicht richtig verinnerlichen und nicht nur zum Laufen bringen...also auch einen sauberen Weg gehen.



  • weisseruebe schrieb:

    Ui...

    Na ich bastel gerade mit OpenGL rum und will das ganze halt objektorientiert machen (und dabei gleich C++ lernen)
    Das Grundprinzip der oo kenne ich an sich schon ganz gut dank Java.

    Konkret möchte ich bei der fertigen glutDisplayFunc halt einen Zeiger auf die Methode Display im Objekt test übergeben.
    Aber woran sehe ich, dass *func da statisch sein muss?
    Kann das glutDisplayFunc nicht egal sein?

    Nein, denn es wird nicht für jedes Object eine neue Funktion im Speicher angelegt. Also wäre eine Adresse von a.func() und b.func() die gleiche. Das einzige was sich verändert, ist ein "unsichtbarer" parameter, der einen zeiger auf die entsprechende instanz also a oder b, beinhaltet.

    mfg.


Anmelden zum Antworten