2011-10-15 11 views
6

He encontrado información sobre llamar a punteros de función miembro de C++ y llamar punteros en estructuras, pero necesito llamar a un puntero de función miembro que existe dentro de una estructura, y no he podido obtener la sintaxis correcta Tengo el siguiente fragmento de código dentro de un método en la clase MyClass:Llamando al puntero de función miembro de C++ desde una estructura

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) { 
    ... 
} 

Esto me da:.

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

Mover los paréntesis alrededor de los resultados en los errores de sintaxis que recomiendan el uso de * o -> * ninguno de los cuales el trabajo en esta situación. ¿Alguien sabe la sintaxis correcta?

+0

http://stackoverflow.com/questions/990625/c-function-pointer-class-member-to-non-static-member-function parece relacionado con esta pregunta. – Rudi

Respuesta

8

Uso:

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

probado y compilaciones ;)

+0

¡Ah perfecto! Gracias por la respuesta, y la respuesta anterior proporciona el razonamiento. – aaron

5

No he compilado ningún código, pero solo al mirarlo puedo ver que te faltan algunas cosas.

  • Eliminar el MyClass:: desde donde se llama al puntero a la función.
  • Necesita pasar el puntero this a las funciones (si usan cualquier dato de instancia), por lo que significa que necesita una instancia de MyClass para llamarlo.

(Después de un poco de investigación) Parece que hay que hacer algo como esto (también gracias a @VoidStar):

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

Gracias por la explicación. La siguiente respuesta funciona (con el paréntesis que incluye 'this' en lugar de 'functionMap'. Gracias por la respuesta. – aaron

+0

No estaba seguro exactamente si los requería o no. Aunque para ese problema, probablemente probaría una solución diferente, como simplemente usar un if, o si se requiere más flexibilidad, algún tipo de patrón Command. – Daemin

Cuestiones relacionadas