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) (...)’
È stato utile?

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:

http://ideone.com/p3a5G

La sintassi è abbastanza innaturale, ma una conseguenza del C ++ precedenza governa ...

(obj.*obj.pf)(1, 2);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top