Methodenzeiger

Ein Zeiger kann nicht nur auf Variablen und Funktionen zeigen, sondern auch auf Methoden. Der Unterschied hierbei ist, dass wir das Objekt auch noch brauchen um die Methode aufrufen zu können.

    #include<iostream>
    using namespace std;

    class Test
    {
    private:
      int id;
    public:
      Test(int id)
      : id(id)
      {}

      void foo()
      {
        cout<<"Test::foo() mit ID "<<id<<'\n';
      }

      void bar()
      {
        cout<<"Test::bar() mit ID "<<id<<'\n';
      }
    };

    void Caller(Test* obj, void (Test::*method)())
    {
      (obj->*method)();
    }

    int main()
    {
      Test t1(1);
      Test t2(2);

      Caller(&t1, &Test::foo);
      Caller(&t2, &Test::foo);

      Caller(&t1, &Test::bar);
      Caller(&t2, &Test::bar);
    }
    
Merksatz!!Ein Zeiger auf die Funktion void funktion(); kann sowohl per funktion als auch per &funktion gebildet werden. Bei Zeiger auf Methoden müssen wir aber &Klasse::Methode schreiben.

Mittels (obj->*methode)() rufen wir methode von der Instanz obj auf. Die Klammern sind hierbei wichtig. Wichtig ist, dass ein Zeiger auf eine Methode alleine nicht viel bringt, da wir immer auch ein Objekt brauchen (den this Zeiger).

Der Typ eines Methodenzeigers ergibt sich aus der Signatur der Methode. Ein Zeiger auf eine Methode kann nicht auf eine Methode mit einer anderen Signatur umgebogen werden. Dies funktioniert nur, wenn beide Methoden die gleiche Signatur haben. Wie in unserem Beispiel foo() und bar().

Auch hier sei wieder auf www.Function-Pointer.org verwiesen.

top