2013-02-11 27 views
16

मेरे पास सदस्य कार्यों के लिए पॉइंटर्स की एक सूची है लेकिन मुझे उन कार्यों को कॉल करने का प्रयास करने में मुश्किल हो रही है ... उचित वाक्यविन्यास क्या है?सी ++ सदस्य फंक्शन के लिए कॉल पॉइंटर

typedef void (Box::*HitTest) (int x, int y, int w, int h); 

for (std::list<HitTest>::const_iterator i = hitTestList.begin(); i != hitTestList.end(); ++i) 
{ 
    HitTest h = *i; 
    (*h)(xPos, yPos, width, height); 
} 

इसके अलावा सदस्य कार्यों यह करने के लिए यहाँ सदस्यों को

std::list<HitTest> list; 

for (std::list<Box*>::const_iterator i = boxList.begin(); i != boxList.end(); ++i) 
{ 
    Box * box = *i; 
    list.push_back(&box->HitTest); 
} 
+0

"कठिन समय होने" को परिभाषित करें –

+2

यह काम नहीं कर रहा है और मैं इसे काम नहीं कर सकता – ThingWings

+0

क्या आप वाकई इस तरह से काम करना चाहते हैं, और बॉक्स तत्वों और वर्चुअल फ़ंक्शन की सूची का उपयोग नहीं करना चाहते हैं? अभिव्यक्ति एक सूचक होना चाहिए: दूसरा कोड SNIPPIT मैं सिंटेक्स त्रुटि हो रही है "त्रुटि के लिए" बाध्य सदस्य समारोह अभिव्यक्ति पर अवैध संचालन: 'और' त्रुटि C2276 " –

उत्तर

24

प्वाइंटर को जोड़ने के लिए कोशिश कर im अद्वितीय वाक्य रचना के साथ एक अद्वितीय जानवर हैं।

आपके पास Box पॉइंटर आसान होना चाहिए जिसका उपयोग this के रूप में किया जाएगा।

(box->*h)(xPos, yPos, width, height); 
+0

मुझे त्रुटि मिलती है "त्रुटि: उस वाक्यविन्यास के साथ अभिव्यक्ति में एक सूचक प्रकार होना चाहिए। – ThingWings

+0

@JC। यहां, इसे आज़माएं: http://www.parashift.com/c++-faq/macro- के लिए-ptr करने वाली memfn.html –

+0

कुछ की तरह '((* इस)। * ज) (xPos, yPos, चौड़ाई, ऊंचाई)' लेकिन मैं दूर मुद्दा रहने के लिए पसंद करते हैं – sehe

7

सदस्य समारोह के सूचक के माध्यम से एक सदस्य समारोह कॉलिंग एक विशेष वाक्य रचना है:

(obj.*pmf)(params); // Through an object or reference. 
(ptr->*pmf)(params); // Through a pointer. 

हालांकि ->* अधिरोहित जा सकता है, यह मानक पुस्तकालय iterators में नहीं है (शायद इसलिए कि यह प्रत्येक संभावित फ़ंक्शन प्रकार के लिए ओवरराइड की आवश्यकता होगी)। तो अगर तुम सब मिल गया है एक इटरेटर है, तो आप इसे भिन्नता है और पहले फार्म का उपयोग करेंगे:

((*iter).*pmf)(params); 

दूसरी ओर, सदस्यों खुद को भी नहीं है करने के लिए एक सूचक से अधिक पुनरावृत्ति इस समस्या:

(objBox.*(*i))(params); // If Box is an object 
(ptrBox->*(*i))(params); // If Box is a pointer 

(मैं तुम्हें *i आसपास कोष्ठक की जरूरत नहीं लगता है, लेकिन सदस्य वाक्य रचना के लिए सूचक काफी पहले से ही खास है।)

5

मेरी "पुरस्कार विजेता" से ;-) जव प्रतिनिधियों के बारे में एर (https://stackoverflow.com/questions/9568150/what-is-a-c-delegate/9568226#9568226 पर उपलब्ध है):

इस तरह सदस्य कार्य करने के लिए सूचक typedef:

fn functionPtr = &MyClass::MyFunction 

इसे इस तरह कॉल करें::

(MyObject.*functionPtr)(argument); 

typedef void (T::*fn)(int anArg); 

इस तरह एक घोषित

0

ऑब्जेक्ट betrays के माध्यम से सदस्य फ़ंक्शन पॉइंटर प्राप्त करने का आपका प्रयास गलतफहमी। सदस्य फ़ंक्शन पॉइंटर्स में उस ऑब्जेक्ट में पॉइंटर शामिल नहीं होता है जिसे आप उन्हें कॉल करते हैं। आपको कॉल के बिंदु पर ऐसे पॉइंटर प्रदान करना होगा।

के रूप में कई ने बताया है, एक सदस्य समारोह कॉल के लिए वाक्य रचना है या तो:

obj.*funcptr(args); 

या

objptr->*funcptr(args); 

उदाहरण आपके द्वारा दिए गए में, यह आप वास्तव में क्या जरूरत है की तरह लगता है एक वर्चुअल फ़ंक्शन है। आपके पास एक मानक ऑपरेशन है (गीले का पता लगाना या किसी ऑब्जेक्ट को बॉक्स के साथ छेड़छाड़ नहीं करना) जिसे कई अलग-अलग प्रकार की वस्तुओं पर बुलाया जाना चाहिए, जिस प्रकार का संकलन समय पर ज्ञात नहीं किया जा सकता है। यह एक नौकरी है जो आभासी कार्यों के लिए कटौती की जाती है।

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