2010-04-06 57 views
39

Tôi cố gọi một hàm được chuyển thành con trỏ hàm không có đối số, nhưng tôi không thể làm cho nó hoạt động.Con trỏ hàm C++ làm tham số

void *disconnectFunc; 

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

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

http://cdecl.org/ có thể trợ giúp. – JRL

+0

@JRL cdecl không giúp ích gì cụ thể (tôi đã thử cdecl trước khi googling câu hỏi này). –

Trả lời

59

Các cách chính xác để làm điều này là:

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 cho việc sử dụng cú pháp ưa thích của tôi de-tham chiếu một con trỏ hàm (thích disconnectFunc() để (* disconnectFunc)(), mặc dù cả hai đều tốt) – Dan

+0

Đây có phải là cách di động hoặc không được khuyến khích sử dụng cho tính di động không? – JavaRunner

+1

@JavaRunner: Nó hoàn toàn di động. – GManNickG

6

Bạn cần khai báo disconnectFunc làm con trỏ hàm, không phải là con trỏ trống. Bạn cũng cần gọi nó như một hàm (với dấu ngoặc đơn) và không cần "*".

+0

Cảm ơn bạn. Mã cuối cùng: void (* disconnectFunc)(); void D :: setDisconnectFunc (void (* func)()) { disconnectFunc = func; } void D :: ngắt kết nối() { (* disconnectFunc)(); được kết nối = false; } –

+1

Tôi sẽ đặt cược nó hoạt động tốt hơn quá;) – WhirlWind

7

Thay void *disconnectFunc; với void (*disconnectFunc)(); tuyên bố chức năng biến kiểu con trỏ. Hoặc thậm chí tốt hơn nên sử dụng một số 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; 
}
Các vấn đề liên quan