Puntatore di chiamata C ++ alla funzione membro

Ho una lista di indicazioni per le funzioni dei membri, ma sto avendo difficoltà a provare a chiamare quelle funzioni … Qual è la syntax corretta?

typedef void (Box::*HitTest) (int x, int y, int w, int h); for (std::list::const_iterator i = hitTestList.begin(); i != hitTestList.end(); ++i) { HitTest h = *i; (*h)(xPos, yPos, width, height); } 

Anche sto cercando di aggiungere funzioni membro ad esso qui

 std::list list; for (std::list::const_iterator i = boxList.begin(); i != boxList.end(); ++i) { Box * box = *i; list.push_back(&box->HitTest); } 

I puntatori ai membri non statici sono una bestia unica con syntax unica.

A tali funzioni deve essere fornito un puntatore, quindi è necessario avere a portata di mano il puntatore a forma di Box che verrà utilizzato come this .

 (box->*h)(xPos, yPos, width, height); 

La chiamata di una funzione membro tramite un puntatore alla funzione membro ha una syntax particolare:

 (obj.*pmf)( params ); // Through an object or reference. (ptr->*pmf)( params ); // Through a pointer. 

Sebbene ->* possa essere sovrascritto, non è negli iteratori di libreria standard (probabilmente perché richiederebbe l’override per ogni tipo di funzione ansible). Quindi se tutto quello che hai è un iteratore, dovrai dereferenziarlo e usare il primo modulo:

 ((*iter).*pmf)( params ); 

D’altra parte, l’iterazione su un puntatore ai membri stessi non ha questo problema:

 (objBox.*(*i))( params ); // If objBox is an object (ptrBox->*(*i))( params ); // If ptrBox is a pointer 

(Non penso che tu abbia bisogno delle parentesi intorno a *i , ma il puntatore alla syntax dei membri è già abbastanza speciale).

Dalla mia “premiata” 😉 risposta ai delegati (disponibile su https://stackoverflow.com/questions/9568150/what-is-ac-delegate/9568226#9568226 ):

Digitare il puntatore alla funzione membro in questo modo:

 typedef void (T::*fn)( int anArg ); 

Dichiara uno come questo:

 fn functionPtr = &MyClass::MyFunction 

Chiamalo così:

 (MyObject.*functionPtr)( argument ); 

Il tuo tentativo di ottenere un puntatore a funzione membro attraverso un object tradisce un equivoco. I puntatori funzione dei membri non includono un puntatore all’object su cui li si chiama. Devi fornire un tale puntatore al punto della chiamata.

Come molti hanno sottolineato, la syntax per una chiamata di funzione membro è:

  obj.*funcptr(args); 

o

  objptr->*funcptr(args); 

Nell’esempio che hai dato, sembra che quello di cui hai veramente bisogno sia una funzione virtuale. Si dispone di un’operazione standard (che rileva se un object interseca o meno una scatola) che deve essere richiamato su molti tipi diversi di oggetti, il cui tipo non può essere conosciuto in fase di compilazione. Questo è un lavoro che è tagliato per le funzioni virtuali.