2010-04-06 21 views
39

मैं फ़ंक्शन पॉइंटर के रूप में पारित फ़ंक्शन को कॉल करने का प्रयास करता हूं, लेकिन मैं इसे काम नहीं कर सकता।सी ++ फ़ंक्शन पॉइंटर पैरामीटर

void *disconnectFunc; 

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

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

http://cdecl.org/ मदद कर सकते हैं। – JRL

+0

@JRL cdecl विशेष रूप से उसमें सहायता नहीं करता है (मैंने इस प्रश्न को गुगल करने से पहले cdecl को आजमाया)। –

उत्तर

59

ऐसा करने का सही तरीका है:

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 फ़ंक्शन पॉइंटर को डी-रेफरेंसिंग के मेरे पसंदीदा वाक्यविन्यास का उपयोग करने के लिए +1 (डिस्कनेक्टफनक() से (* डिस्कनेक्टफनक)() को पसंद करें, भले ही वे दोनों ठीक हों) – Dan

+0

क्या यह पोर्टेबल तरीका है या पोर्टेबिलिटी के लिए उपयोग करने की अनुशंसा नहीं की जाती है? – JavaRunner

+1

@JavaRunner: यह पूरी तरह से पोर्टेबल है। – GManNickG

6

आपको डिस्कनेक्टफनक को फ़ंक्शन पॉइंटर के रूप में घोषित करने की आवश्यकता है, न कि एक शून्य सूचक। आपको इसे फ़ंक्शन (कोष्ठक के साथ) के रूप में भी कॉल करने की आवश्यकता है, और "*" की आवश्यकता नहीं है।

+0

धन्यवाद। अंतिम कोड: शून्य (* डिस्कनेक्टफनक)(); शून्य डी :: setDisconnectFunc (शून्य (* func)()) { disconnectFunc = func; } शून्य डी :: डिस्कनेक्ट() { (* डिस्कनेक्टफनक)(); जुड़े = झूठे; } –

+1

मैं शर्त लगाता हूं कि यह बेहतर तरीके से काम करता है;) – WhirlWind

7

void (*disconnectFunc)(); साथ void *disconnectFunc; बदलें समारोह सूचक प्रकार चर घोषित करने के लिए। या 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; 
}
संबंधित मुद्दे