Come richiamare puntatore a funzione membro quando è un membro di dati di classe?
-
26-10-2019 - |
Domanda
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 ?
}
Nel codice di prova di cui sopra, pf
è un membro di dati di B
. Qual è la regola grammaticale per invocarlo? Dovrebbe essere semplice, ma io non sto ottenendo una partita corretta. per esempio. Se provo obj.*pf(0,0);
allora ottengo:
error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘pf (...)’, e.g. ‘(... ->* pf) (...)’
Soluzione
In questo modo:
(obj.*obj.pf)(0, 1);
accesso Utente (.
) ha una precedenza maggiore di un puntatore a operatore di membro quindi questo è equivalente a:
(obj.*(obj.pf))(0, 1);
A causa chiamata di funzione ha anche la precedenza più alto di un puntatore a operatore di membro, non si può fare:
obj.*obj.pf(0, 1) /* or */ obj.*(obj.pf)(0, 1)
Come che sarebbe equivalente a:
obj.*(obj.pf(0, 1)) // grammar expects obj.pf to be a callable returning a
// pointer to member
Altri suggerimenti
pf è un puntatore metodo, e si desidera richiamare il metodo a cui punta, quindi bisogna usare
(obj.*obj.pf)(1, 2);
Si dice che l'oggetto che si obj invocare il metodo indicato dal pf
Vedere risultato qui:
La sintassi è abbastanza innaturale, ma una conseguenza del C ++ precedenza governa ...
(obj.*obj.pf)(1, 2);