Wie kann ich Zeiger auf die Mitgliedsfunktion aufrufen, wenn es sich um ein Klassendatenmitglied handelt?

StackOverflow https://stackoverflow.com/questions/6316751

Frage

struct B
{
  void (B::*pf)(int, int);  // data member
  B () : pf(&B::foo) {}
  void foo (int i, int j) { cout<<"foo(int, int)\n"; } // target method
};

int main ()
{
  B obj;
  // how to call foo() using obj.pf ?
}

Im obigen Testcode, pf ist ein Datenmitglied von B. Was ist die Grammatikregel, um sie aufzurufen? Es sollte einfach sein, aber ich bekomme kein richtiges Match. ZB, wenn ich es versuche obj.*pf(0,0); Dann bekomme ich:

error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘pf (...)’, e.g. ‘(... ->* pf) (...)’
War es hilfreich?

Lösung

So was:

(obj.*obj.pf)(0, 1);

Mitgliederzugang (.) hat einen höheren Vorrang als ein Zeiger auf den Mitgliedsbetreiber, so dass dies entspricht:

(obj.*(obj.pf))(0, 1);

Da der Funktionsaufruf auch höhere Vorrang vornimmt als ein Zeiger auf den Mitgliedsbetreiber, können Sie dies nicht tun:

obj.*obj.pf(0, 1) /* or */ obj.*(obj.pf)(0, 1)

Da das gleichwertig wäre:

obj.*(obj.pf(0, 1)) // grammar expects obj.pf to be a callable returning a
                    // pointer to member

Andere Tipps

PF ist ein Methodenzeiger, und Sie möchten die Methode aufrufen, auf die sie verweist, also müssen Sie verwenden

(obj.*obj.pf)(1, 2);

Es heißt das Objekt, das Sie auf die von PF gerichtete Methode aufrufen

Siehe Ergebnis hier:

http://ideone.com/p3a5g

Die Syntax ist ziemlich unnatürlich, aber eine Folge von C ++ - Vorrangregeln ...

(obj.*obj.pf)(1, 2);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top