Fehler bei Pointer zu Member Funktion aus anderer Klasse



  • Hallo,
    ich will einen Pointer auf eine Member Funktion einer anderen Klasse machen, aber irgendwie funktioniert das nicht.

    Updater.h

    class KeyController;
    
    class Updater{
    public:
        Updater();
    private:
        typedef void (KeyController::*FunkPointer) (int);
        FunkPointer funkP;
    }
    

    Updater.cpp

    #include "keycontroller.h"
    
    Updater::Updater(){
        funkP = &(KeyController::a);
        funkP = &(KeyController::b);
    }
    

    KeyController.h

    class KeyController
    {
    public:
        void a(int);
        static void b(int);
    }
    

    In a und b steht nichts drin.

    Bei funkP = &(KeyController::a); krieg ich den Fehler:

    Fehler:invalid use of non-static member function 'void KeyController::a(int)'
    

    Bei funkP = &(KeyController::b);:

    Fehler:cannot convert 'void (*)(int)' to 'Updater::FunkPointer {aka void (KeyController::*)(int)}' in assignment
    

    Ich kapiers nicht, ich machs doch genau so wie hier: http://www.parashift.com/c++-faq/typedef-for-ptr-to-memfn.html



  • Nein, tust du nicht. Mach die Klammern weg.



  • Kellerautomat schrieb:

    Nein, tust du nicht. Mach die Klammern weg.

    Alle? 🤡



  • Kellerautomat schrieb:

    Nein, tust du nicht. Mach die Klammern weg.

    Oh, stimmt, mit a gehts jetzt. Danke 🙂
    Bei der static Funktion b gehts aber nur, wenn ich

    typedef void (*FunkPointer) (int);
    

    statt

    typedef void (KeyController::*FunkPointer) (int);
    

    schreibe.

    Kann man einen Pointer machen, der sowohl auf static als auch auf nicht-static Funktionen zeigen kann?



  • Das liegt daran, weil du für einen static-Methodenaufruf kein Objekt benötigst. Ja kann man, ist aber etwas umständlicher. Wenn du nach "delegate c++" oder "delegation" googlest wirst du da einige Implementationen finden (Boost::function bietet genau das auch, ist aber Performancetechnisch sehr langsam)

    Edit: was nicht möglich ist (jedenfalls im C++ Standard), ein und denselben Pointer auf Methoden und Static-Methoden zeigen zu lassen. Gehen tut AFAIR aber Static-Methoden und Funktionen (OO-Sinne). Zusätzlich musst du für die const-correctness auch noch einen eigenen Pointer haben.


Anmelden zum Antworten