2011-08-16 16 views
10

के साथ फ़ंक्शन पॉइंटर्स का उपयोग करना मैं एक फ़ंक्शन को पैरामीटर के रूप में किसी अन्य फ़ंक्शन में पास करने का प्रयास कर रहा हूं, और वे दोनों एक ही कक्षा के सदस्य कार्य होते हैं।सी ++: सदस्य फ़ंक्शंस

मुझे एक अजीब त्रुटि मिल रही है और मैं यह नहीं समझ सकता कि समस्या क्या है।

यहाँ मेरी कार्य हैं:

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

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

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

हालांकि, मैं निम्न त्रुटि हो रही है:

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

तो क्या देता है? मुझे लगता है कि मैंने इसे काम करने के लिए हर बदलाव की कोशिश की है। क्या आप सदस्य कार्यों के लिए फ़ंक्शन पॉइंटर्स भी पास कर सकते हैं? में इससे कैसे चला सकता हूँ?

नोट: फ़ंक्शन टॉपास स्थिर बनाना वास्तव में एक वैध विकल्प नहीं है।

+0

त्रुटि संदेश आपको समस्या को ठीक करने के लिए सभी आवश्यक जानकारी देता है। –

+0

'बूस्ट :: फ़ंक्शन' का उपयोग फ़ंक्शन पॉइंटर्स का उपयोग करने से आसान हो सकता है। आपको यह जांचना होगा कि क्या यह 'boost :: function ' होना चाहिए (जिस स्थिति में 'function2' को' यह 'बांधना चाहिए) या' boost :: function '(जिस स्थिति में 'function1' '* यह' पास करना चाहिए) – MSalters

उत्तर

11

आप सदस्य फ़ंक्शंस में फ़ंक्शन पॉइंटर्स पास कर सकते हैं। लेकिन यह नहीं है कि आपका कोड क्या कर रहा है। आप नियमित फ़ंक्शन पॉइंटर्स के बीच उलझन में हैं (void (*passedFunction)() एक नियमित फ़ंक्शन पॉइंटर है) और सदस्य फ़ंक्शंस के पॉइंटर्स (&myClass::functionToPass किसी सदस्य फ़ंक्शन के लिए पॉइंटर है)। वे एक ही बात नहीं हैं और वे संगत नहीं हैं।

आप इस

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

अब आप अपने कोड सदस्य कार्यों के लिए संकेत उपयोग कर रहा है की तरह अपने कोड को फिर से लिखने कर सकते हैं, लेकिन निश्चित रूप से इसका मतलब है आप एक नियमित समारोह सूचक पारित करने में सक्षम नहीं होगा।

+0

समझ में आता है! मुझे कल तक इसका परीक्षण करने का मौका नहीं है, लेकिन अगर यह काम करता है तो मैं निश्चित रूप से स्वीकार कर दूंगा। –

+1

फ़ंक्शन पॉइंटर ट्यूटोरियल: http://www.newty.de/fpt/index.html (बहुत आसान) –

1

जैसा कि दूसरों द्वारा इंगित किया गया है, आपकी गलती फ़ंक्शन पॉइंटर को पारित करने के प्रकार में है। यह void (myClass::*passedFunction)() होना चाहिए।

सी ++ में सदस्य कार्यों के लिए पॉइंटर्स का उपयोग करने पर एक अच्छा tutorial है।

+0

तो" इस "काम के कुछ बदलाव का उपयोग कर सकते हैं? –

+0

क्षमा करें, मुझे इस तथ्य से चूक गया कि आप एक ही कक्षा के सदस्य समारोह में फ़ंक्शन पॉइंटर पास कर रहे थे। मैंने सोचा था कि आप इसे किसी अन्य फ़ंक्शन में पास कर रहे थे, इस मामले में आपको 'पासक्लक्शन' द्वारा इंगित फ़ंक्शन को वास्तव में कॉल करने के लिए 'myClass'' की एक वस्तु की आवश्यकता होगी। – Dima

संबंधित मुद्दे