2013-02-11 26 views
16

Ho una lista di puntatori alle funzioni membro, ma sto avendo difficoltà a cercare di chiamare quelle funzioni ... Qual è la sintassi corretta?Puntatore di chiamata C++ alla funzione membro

typedef void (Box::*HitTest) (int x, int y, int w, int h); 

for (std::list<HitTest>::const_iterator i = hitTestList.begin(); i != hitTestList.end(); ++i) 
{ 
    HitTest h = *i; 
    (*h)(xPos, yPos, width, height); 
} 

anche nel tentativo di aggiungere funzioni membro ad esso qui

std::list<HitTest> list; 

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

definire "avere un momento difficile" –

+2

Non funziona lol e non riesco a farlo funzionare – ThingWings

+0

Sei sicuro di voler fare le cose in questo modo, e non utilizzando un elenco di elementi Box e una funzione virtuale? –

risposta

24

puntatori ai membri sono una bestia unica con la sintassi unica.

È necessario disporre del puntatore Box a portata di mano che verrà utilizzato come this.

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

Viene visualizzato l'errore "Errore: espressione deve avere un tipo di puntatore" con tale sintassi. – ThingWings

+0

@JC. Ecco, prova questo: http://www.parashift.com/c++-faq/macro- for-ptr-to-memfn.html –

+0

Qualcosa come '((* questo). * h) (xPos, yPos, larghezza, altezza)' ma preferisco stare lontano – sehe

7

Chiamata di una funzione membro attraverso un puntatore a funzione membro ha una particolare sintassi:

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

Anche se ->* può essere ignorato, non è nello standard iteratori libreria (probabilmente perché richiederebbe l'override per ogni tipo di funzione possibile). Quindi, se tutto quello che hai è un iteratore, dovrete dereferenziarlo e utilizzare la prima forma:

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

D'altra parte, l'iterazione di un puntatore ai membri stessi non hai questo problema:

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

(non credo che avete bisogno le parentesi intorno al *i, ma il puntatore alla sintassi membro è già abbastanza speciale.)

0

Il tentativo di ottenere un puntatore a funzione membro tramite un oggetto tradisce un fraintendimento. I puntatori funzione dei membri non includono un puntatore all'oggetto su cui li si chiama. Devi fornire un tale puntatore al punto della chiamata.

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

obj.*funcptr(args); 

o

objptr->*funcptr(args); 

Nell'esempio che hai dato, suona come quello che si ha realmente bisogno è una funzione virtuale. Si dispone di un'operazione standard (che rileva se un oggetto 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.

Problemi correlati