2011-08-16 35 views
10

Estoy tratando de pasar una función a otra función como parámetro, y ambos resultan ser funciones miembro de la misma clase.C++: Uso de punteros de función con funciones de miembro

Me aparece un error extraño y no puedo entender cuál es el problema.

Aquí están mis funciones:

void myClass::functionToPass() 
{ 
    // does something 
} 

void myClass::function1(void (*passedFunction)()) 
{ 
    (*passedFunction)(); 
} 

void myClass::function2() 
{ 
    function1(&myClass::functionToPass); 
} 

Sin embargo, estoy recibiendo el siguiente error:

cannot convert parameter 1 from 'void(__thiscall myClass::*) (void)' 
    to 'void(__cdecl*)(void)' 

Entonces, ¿qué pasa? Siento que he probado todas las variaciones para intentar que esto funcione. ¿Puede incluso pasar punteros a las funciones de los miembros? ¿Cómo puedo hacer que esto funcione?

Nota: Hacer functionToPass static no es realmente una opción válida.

+0

El mensaje de error le brinda toda la información necesaria para solucionar el problema. –

+0

Usar 'boost :: function' puede ser más fácil que usar punteros a funciones. Tendría que comprobar si eso debería ser 'boost :: function ' (en cuyo caso 'function2' debería enlazar' this') o 'boost :: function ' (en cuyo caso 'function1' debería pasar '* this') – MSalters

Respuesta

11

Puede pasar punteros a las funciones de los miembros. Pero eso no es lo que hace tu código. Se le confunde entre los punteros de función normal (void (*passedFunction)() es un puntero de función normal) y punteros a funciones de miembro (&myClass::functionToPass es un puntero a una función de miembro). No son lo mismo y no son compatibles.

puede volver a escribir el código como este

void myClass::function1(void (myClass::*passedFunction)()) 
{ 
    (this->*passedFunction)(); 
} 

Ahora su código está utilizando punteros a funciones miembro, pero por supuesto esto significa que usted no será capaz de pasar un puntero función regular.

+0

¡Tiene sentido! No tengo la oportunidad de probar esto hasta mañana, pero si funciona, definitivamente daré una respuesta. –

+1

Tutorial del puntero de función: http://www.newty.de/fpt/index.html (muy útil) –

1

Como señalaron otros, su error está en el tipo del puntero de función que se está pasando. Debe ser void (myClass::*passedFunction)().

Aquí hay una buena tutorial sobre el uso de punteros a funciones miembro en C++.

+0

así que ¿podría usar alguna variación de" este "trabajo? –

+0

Lo siento, me perdí el hecho de que estabas pasando el puntero a una función miembro de la misma clase. Pensé que lo estabas pasando a alguna otra función, en cuyo caso necesitarías un objeto de 'myClass' para llamar realmente a la función apuntada por' passedFunction'. – Dima

Cuestiones relacionadas