2010-04-06 34 views
39

Intento llamar a una función que pasó como puntero a función sin argumento, pero no puedo hacer que funcione.Puntero de función C++ como parámetro

void *disconnectFunc; 

void D::setDisconnectFunc(void (*func)){ 
    disconnectFunc = func; 
} 

void D::disconnected(){ 
    *disconnectFunc; 
    connected = false; 
} 
+6

http://cdecl.org/ puede ayudar. – JRL

+0

@JRL cdecl no ayuda con eso en particular (probé cdecl antes de buscar en Google esta pregunta). –

Respuesta

59

La forma correcta de hacerlo es:

typedef void (*callback_function)(void); // type for conciseness 

callback_function disconnectFunc; // variable to store function pointer type 

void D::setDisconnectFunc(callback_function pFunc) 
{ 
    disconnectFunc = pFunc; // store 
} 

void D::disconnected() 
{ 
    disconnectFunc(); // call 
    connected = false; 
} 
+0

+1 para usar mi sintaxis preferida para desviar referencias a un puntero de función (prefiero disconnectFunc() a (* disconnectFunc)(), aunque ambos estén bien) – Dan

+0

¿Es esta manera portátil o no se recomienda su uso para la portabilidad? – JavaRunner

+1

@JavaRunner: es perfectamente portátil. – GManNickG

6

Debe declarar disconnectFunc como un puntero a la función, no como un puntero de vacío. También debe llamarlo como una función (con paréntesis) y no se necesita "*".

+0

Gracias. Código final: void (* disconnectFunc)(); void D :: setDisconnectFunc (void (* func)()) { disconnectFunc = func; } void D :: desconectado() { (* disconnectFunc)(); connected = false; } –

+1

Apuesto a que también funciona mucho mejor;) – WhirlWind

7

Reemplazar void *disconnectFunc; con void (*disconnectFunc)(); para declarar la función variable de tipo puntero. O mejor aún use un typedef:

typedef void (*func_t)(); // pointer to function with no args and void return 
... 
func_t fptr; // variable of pointer to function 
... 
void D::setDisconnectFunc(func_t func) 
{ 
    fptr = func; 
} 

void D::disconnected() 
{ 
    fptr(); 
    connected = false; 
}
Cuestiones relacionadas