función miembro privada que toma un puntero a un miembro privado en la misma clase
-
19-09-2019 - |
Pregunta
¿Cómo puedo hacer esto? (El código siguiente no funciona, pero espero que explica la idea.)
class MyClass
{
....
private:
int ToBeCalled(int a, char* b);
typedef (MyClass::*FuncSig)(int a, char* b);
int Caller(FuncSig *func, char* some_string);
}
Quiero llamar de llamadas de cierta manera como:
Caller(ToBeCalled, "stuff")
y tienen Caller
llamada ToBeCalled
con lo que los parámetros que se siente necesidades que pasa. Si es posible quiero mantener todo encapsulado en la parte privada de mi clase. En realidad, tendría unos 50 funciona como ToBeCalled
, así que no puedo ver una manera de evitar esto.
Gracias por cualquier sugerencia. :)
Solución
Usted es la mayor parte del camino. Que se está perdiendo el tipo de retorno de la typedef, debería ser
typedef int (MyClass::*FuncSig)(int, char*);
Ahora, sólo tiene que utilizar correctamente:
int Caller(FuncSig func, int a, char* some_string)
{
return (this->*func)(a, some_string);
}
¿Quieres pasar alrededor de los casos FuncSig
de fricción, no FuncSig*
- un FuncSig*
es un puntero a un puntero a una función miembro, con un nivel innecesario extra de indirección. A continuación, utiliza el operador flecha estrellas (no su nombre oficial) para llamar a él:
(object_to_be_called_on ->* func)(args);
Para objetos que no son de puntero (por ejemplo, objetos en la pila, o referencias a objetos), se utiliza el operador punto estrellas:
MyClass x;
(x .* func)(args);
También, tener cuidado de precedencia de los operadores - los operadores flecha-estrella y punto-estrella tienen menor prioridad que las llamadas de función, por lo que necesita para poner en los paréntesis adicionales como lo he hecho anteriormente
.Otros consejos
Estoy asumiendo que ha intentado Caller(MyClass::ToBeCalled, "stuff")
ya, pero ¿hay alguna razón en particular que necesita un puntero de función? También, por favor, puesto que el error del compilador real.