Zeiger und Funktionen



  • Hallo!

    Ich habe eine Frage zu folgendem Code:

    #include <iostream>
    
    class A
    {
    private:
    	int m_a, m_b;
    public:
    	void seta(int a) {m_a = a;}
    	int geta() {return m_a;}
    	void setb(int b) {m_b = b;}
    	int getb() {return m_b;}
    
    	typedef void (A::* func)(int); // ??
    
    };
    
    int main()
    {
    
    	A a;
    	A::func f;
    
    	f = &A::seta;
    	(a.*f)(3);	// Hier wird seta aufgerufen
    	f = &A::setb;
    	(a.*f)(5);  // Hier wird setb aufgerufen
    
    	cout << a.geta() << endl;
    	cout << a.getb() << endl;
    
    	return 0;
    }
    

    Wie man sieht werden zwei Methoden der Klasse A jeweils über den Zeiger f aufgerufen, nach dem ihm die Adressen der Methoden übergeben wurden. Soweit ist mir das klar. Mein Problem ist das typedef. Wie ist das gemeint? Mir ist schon klar dass das den typ func definiert, der auf eine Methode dieser Klasse zeigen kann, aber warum? Ich raff einfach nicht was

    typedef void (A::* func)(int);
    

    genau macht. Insbesondere das A::. Warum heißt es A:: und nicht A? Und warum steht der typname func in der Klammer und nicht hinter dem ganzen typedef?
    Wäre nett wenn mir das jemand erklären könnte...

    Meine zweite Frage ist die folgende (hängt rerlativ eng mit der oberen zusammen):

    #include <iostream>
    
    void test()
    {
    	cout << "hallo";
    }
    
    int main()
    {
    	void* fp = &test; // Adresse der FUnktion in Zeiger schreiben
    	(*fp)(); // geht nicht
    }
    

    Wie kann ich die Funktion Test über den Zeiger aufrufen? So gehts jedenfalls nicht. Muss ich da zuerst noch casten oder so, wenn ja wie? Die genaue Fehlermeldung hab ich jetzt nicht vor mir, es war aber irgendwas wie "Kein gültiger Funktionsaufruf" oder so...

    Vielen Dank für eure Mühe!



  • Hi!

    Wie man sieht werden zwei Methoden der Klasse A jeweils über den Zeiger f aufgerufen, nach dem ihm die Adressen der Methoden übergeben wurden. Soweit ist mir das klar. Mein Problem ist das typedef. Wie ist das gemeint? Mir ist schon klar dass das den typ func definiert, der auf eine Methode dieser Klasse zeigen kann, aber warum? Ich raff einfach nicht was

    Die Syntax für Funktionszeiger ist eben so:

    typedef rückgabewert (zeigername)(parameterliste)
    

    Das A::* steht für einen Zeiger auf eine Funktion der Klasse A.

    grüße



  • Ok, Danke dann ist das klar.
    Mich wunderts nur dass es nicht

    typedef void (A* func)(int)
    

    heißt.

    Dann müsste ich bei meiner zweiten Frage schreiben:

    #include <iostream>
    
    void test()
    {
        cout << "hallo";
    }
    
    int main()
    {
        typedef void (*Fp)();
        Fp fp;
        fp = &test;
        (*fp)(); 
    }
    

    kanns jetzt leider nicht ausprobieren



  • A* wäre ja ein Zeiger vom Typ A.
    A::* ist ein Zeiger auf eine Methode von A.



  • Dann müsste ich bei meiner zweiten Frage schreiben:

    #include <iostream>
    
    void test()
    {
        cout << "hallo";
    }
    
    int main()
    {
        typedef void (*Fp)();
        Fp fp;
        fp = &test;
        (*fp)(); 
    }
    

    kanns jetzt leider nicht ausprobieren

    👍 Das richtig!



  • Ok, vielen Dank jetzt ist mir das klar 👍



  • wo liegt nun der unterschied zu dem hier? (das geht auch)

    typedef void(*fp)();
     fp FP;
     FP = test;
     FP();
    


  • keine Ahnung, aber geh davon aus dass es einfach das gleiche bewirkt.


Anmelden zum Antworten