Wie kann ich Zeiger auf die Mitgliedsfunktion aufrufen, wenn es sich um ein Klassendatenmitglied handelt?
-
26-10-2019 - |
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) (...)’
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:
Die Syntax ist ziemlich unnatürlich, aber eine Folge von C ++ - Vorrangregeln ...
(obj.*obj.pf)(1, 2);