Quiero implementar una clase en C++ que tenga una devolución de llamada.¿Cómo implemento una devolución de llamada en C++?
Así que creo que necesito un método que tiene 2 argumentos:
- el objeto de destino. (digamos * myObj)
- el puntero a una función miembro de el objeto de destino. (Por lo que puedo hacer * myObj-> memberFunc();)
Las condiciones son:
myObj puede ser de cualquier clase.
la función de miembro que va a ser la función de devolución de llamada no es estática.
He estado leyendo sobre esto pero parece que necesito saber la clase de myObj antes de la mano. Pero no estoy seguro de cómo hacerlo. ¿Cómo puedo manejar esto? ¿Es esto posible en C++?
Esto es algo que tengo en mente, pero seguramente es incorrecto.
class MyClassWithCallback{
public
void *targetObj;
void (*callback)(int number);
void setCallback(void *myObj, void(*callbackPtr)(int number)){
targetObj = myObj;
callback = callbackPtr;
};
void callCallback(int a){
(myObj)->ptr(a);
};
};
class Target{
public
int res;
void doSomething(int a){//so something here. This is gonna be the callback function};
};
int main(){
Target myTarget;
MyClassWithCallback myCaller;
myCaller.setCallback((void *)&myTarget, &doSomething);
}
Agradezco cualquier ayuda.
Gracias.
ACTUALIZACIÓN La mayoría de ustedes dijo Observando y Delegación, bueno, eso es exactamente lo que estoy buscando, soy un chico con mentalidad de Objective-C/Cocoa. Mi implementación actual usa interfaces con funciones virtuales. Es solo que pensé que sería "más inteligente" simplemente pasar el objeto y un puntero de función miembro (¡como aumentar!) En lugar de definir una interfaz. Pero parece que todo el mundo está de acuerdo en que las interfaces son la forma más fácil, ¿verdad? Boost parece ser una buena idea, (asumiendo que está instalado)
patrón Observer requiere cambios en la interfaz de la clase "observados", a veces es un uso mucho más sencillo y claro '' function' y bind' en lugar de interfaces. También tenga en cuenta que si usa gcc reciente, ya tiene 'function' y' bind', por lo que no necesita boost. Usando la función de vinculación/es patrones de programación funcionales, mientras que el uso de interfaces está más con patrón de diseño "estándar" que tiene diferente significado – Artyom