2010-04-06 2 views
39

Provo a chiamare una funzione passata come puntatore di funzione senza argomento, ma non riesco a farlo funzionare.Puntatore di funzione C++ come parametro

void *disconnectFunc; 

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

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

http://cdecl.org/ può aiutare. – JRL

+0

@JRL cdecl non aiuta in particolare (ho provato cdecl prima di cercare su Google questa domanda). –

risposta

59

Il modo corretto per farlo è:

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 per usare la mia sintassi preferita di de-referenziare un puntatore a funzione (preferisci disconnectFunc() a (* disconnectFunc)(), anche se vanno bene entrambi) – Dan

+0

È questo modo portatile o non è consigliato l'uso per la portabilità? – JavaRunner

+1

@JavaRunner: è perfettamente portatile. – GManNickG

6

È necessario dichiarare disconnectFunc come puntatore a funzione, non come puntatore vuoto. È inoltre necessario chiamarlo come una funzione (con parentesi) e non è necessario "*".

+0

Grazie. Codice finale: void (* disconnectFunc)(); void D :: setDisconnectFunc (void (* func)()) { disconnectFunc = func; } vuoto D :: disconnected() { (* disconnectFunc)(); connected = false; } –

+1

Scommetto che funziona anche molto meglio;) – WhirlWind

7

Sostituire void *disconnectFunc; con void (*disconnectFunc)(); per dichiarare variabile di tipo puntatore a funzione. O ancora meglio utilizzare uno 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; 
}