2011-10-15 2 views
6

Ho trovato informazioni sulla chiamata di puntatori di funzione membro C++ e puntatori a chiamata nelle strutture, ma ho bisogno di chiamare un puntatore a funzione membro presente all'interno di una struttura e non sono stato in grado di ottenere la sintassi corretta. Ho il seguente frammento di codice all'interno di un metodo della classe MyClass:Chiamare il puntatore funzione membro C++ da una struct

void MyClass::run() { 
    struct { 
     int (MyClass::*command)(int a, int b); 
     int id; 
    } functionMap[] = { 
     {&MyClass::commandRead, 1}, 
     {&MyClass::commandWrite, 2}, 
    }; 

    (functionMap[0].MyClass::*command)(x, y); 
} 

int MyClass::commandRead(int a, int b) { 
    ... 
} 

int MyClass::commandWrite(int a, int b) { 
    ... 
} 

Questo mi dà:.

error: expected unqualified-id before '*' token 
error: 'command' was not declared in this scope 
(referring to the line '(functionMap[0].MyClass::*command)(x, y);') 

Muoversi quelle parentesi intorno risultati in errori di sintassi raccomandare utilizzando * o -> * nessuno dei quali lavoro in questa situazione. Qualcuno conosce la sintassi corretta?

+0

http://stackoverflow.com/questions/990625/c-function-pointer-class-member-to-non-static-member-function sembra correlato a questa domanda. – Rudi

risposta

8

Usa:

(this->*functionMap[0].command)(x, y); 

Testato e compila ;)

+0

Ah perfetto Grazie per la risposta e la risposta sopra riportata fornisce il ragionamento. – aaron

5

Non ho compilato alcun codice, ma solo guardandolo posso vedere che ti mancano alcune cose.

  • Rimuovere MyClass:: da dove si chiama il puntatore della funzione.
  • È necessario passare il puntatore this alle funzioni (se utilizzano dati di istanza), quindi ciò significa che è necessario chiamare un'istanza di MyClass.

(Dopo un po 'di ricerca) Sembra che avete bisogno di fare qualcosa di simile (anche grazie a @VoidStar):

(this->*(functionMap[0].command)(x, y)); 
+0

Grazie per la spiegazione. La risposta di seguito funziona (con la parentesi che include 'questo' al posto di 'functionMap'. Grazie per la risposta. – aaron

+0

Non ero sicuro di averlo richiesto o meno, anche se probabilmente avrei tentato una soluzione diversa, Ad esempio, se si utilizza un if o se è necessaria una maggiore flessibilità, è necessario un tipo di comando Command – Daemin