Methodenzeiger wie casten?



  • Hallo zusammen,

    ich hoffe ihr könnt mir helfen.

    kann mir jemand sagen ich wie folgendes Kompiliert bekomme?

    typedef void (*Mytypdef)();
    
    class A
    {
        private:
        public:
            A();
            Mytypdef MeineFunktion;
    };
    
    class B
    {
        private:
            A Test;
    
        public:
            B();
    
            void funktion2()
            {
                // Do anything
            }
    
            void funktion1()
            {
                Test.MeineFunktion=funktion2;
            }
    };
    

    ist zwar ein sinnloses Beispiel aber beschreibt was ich will.

    der Compiler schmeißt jetzt folgenden Fehler:

    cannot convert 'B::funktion2' from type 'void (B::)()' to type 'Mytypdef {aka void (*)()}'
    

    macht ja durchaus Sinn, aber wie geht's richtig? in VCL gibt's das Schlüsselwort __closure aber das kennt der Compiler (gcc) nicht


  • Mod

    Die Lösung heißt std::function :

    using Mytypdef = std::function<void()>;
    
    class A
    {
            Mytypdef MeineFunktion;
    };
    
    class B
    {
        private:
            A Test;
    
        public:
    
            void funktion2()
            {
                // Do anything
            }
    
            void funktion1()
            {
                Test.MeineFunktion = std::bind(funktion2, this);
            }
    };
    

    Dafür musst du den Header <functional> einbinden.



  • Frageman123 schrieb:

    ich hoffe ihr könnt mir helfen.

    Arcoth hat zwar schon eine mögliche Lösung genannt, ich finde es aber besser wenn sagt, warum etwas nicht klappt.

    Dies ist ein Funktionszeiger:

    Frageman123 schrieb:

    typedef void (*Mytypdef)();
    

    Sobald du mit nicht-statischen Funktionen von Klassen arbeitest (häufig auch als Methoden bezeichnet), reicht das nicht. Eine Klasse ist ja nur eine Schablone für konkrete Objekte. Nehmen wir mal an du hast folgenden Fall:

    class Integer {
        private:
            int wert;
    
        public:
            Integer(int wert) : wert(wert) {}
            int WertPlusZwei() { return wert + 2; }
    }
    
    int main()
    {
        Integer a(1), b(4);
    }
    

    Wenn du nun einen Funktionszeiger auf die Methode "WertPlusZwei" anlegen würdest. Was würdest du als Ergebnis erwarten? Es fehlt der Objektbezug. Willst du es nun auf a oder b anwenden? Was fehlt ist der "this"-Zeiger, der Verweis auf das Objekt. Dies ist der große Unterschied zwischen Funktionen und Methoden. Falls du noch mehr dazu wissen willst, such mal nach "C++ pointer to member function".

    std::function kann mit beiden Fällen umgehen, erwartet bei Methoden aber wie in Arcoths Beispiel zu sehen einen Objektverweis (hier this).


Anmelden zum Antworten