दिलचस्प पोस्ट
MinGW / CxxTest विचित्र त्रुटियों लिनक्स में आईटाओए समारोह कहाँ है? बैश कमांड से टेक्स्ट फाइल के अंदर खोजें और बदलें इनपुट () त्रुटि – NameError: नाम '…' परिभाषित नहीं है टिक टीएसी को पैर की अंगुली खेल को निर्धारित करने के लिए एल्गोरिदम छुपा UIViews के साथ AutoLayout? मैं C ++ में एरेज़ का उपयोग कैसे करूं? बेस 64 एन्कोडिंग छवि कोई भी अच्छा पायथन आधारित वेब क्रॉलर का पता है जिसे मैं उपयोग कर सकता था? पायथन भारित रैंडम Webdriver.Dispose () के बीच का अंतर,। बंद करें () और .क्विट () android.view.InflateException: बाइनरी XML फ़ाइल: कक्षा खंड बढ़ाना त्रुटि रेगेक्स मुद्रा सत्यापन UIAppearance का उपयोग करके कस्टम आईओएस यूआईडेटिकपिकर * ngIf और * ngFor त्रुटि के कारण एक ही तत्व पर

सी ++ में एक तर्क के रूप में सदस्य फ़ंक्शन पास करना

संभव डुप्लिकेट:
सी ++, सदस्य फ़ंक्शन के लिए फ़ंक्शन पॉइंटर

प्रश्न निम्न है: कोड के इस टुकड़े पर विचार करें:

#include <iostream> class aClass { public: void aTest(int a, int b) { printf("%d+%d=%d",a,b,a+b); } }; void function1(void (*function)(int,int)) { function(1,1); } void test(int a,int b) { printf("%d-%d=%d",a,b,ab); } int main (int argc, const char * argv[]) { aClass a(); function1(&test); function1(&aClass::aTest ); // <-- how should I point to a's aClass::test function? return 0; } 

मैं function1 तर्क के रूप में एक aClass::test उपयोग कैसे कर सकता / सकती हूं? मैं ऐसा करने में फंस गया हूँ

मैं कक्षा के किसी सदस्य का उपयोग करना चाहता हूं।

वेब के समाधान से एकत्रित समाधान "सी ++ में एक तर्क के रूप में सदस्य फ़ंक्शन पास करना"

फ़ंक्शन पॉइंटर्स का उपयोग करने में कुछ भी गलत नहीं है हालांकि, गैर-स्थिर सदस्य कार्य करने के लिए पॉइंटर्स सामान्य फ़ंक्शन पॉइंटर्स की तरह नहीं हैं: सदस्य कार्यों को किसी वस्तु पर बुलाया जाना चाहिए जो फ़ंक्शन के लिए एक निहित तर्क के रूप में पारित किया गया है। ऊपर अपने सदस्य समारोह के हस्ताक्षर, इस प्रकार है

 void (aClass::*)(int, int) 

उस प्रकार के बजाय जो आप उपयोग करने का प्रयास करते हैं

 void (*)(int, int) 

एक दृष्टिकोण सदस्य को static बनाने में शामिल हो सकता है, जिस स्थिति में इसे किसी भी ऑब्जेक्ट को कॉल करने की आवश्यकता नहीं होती है और आप इसे टाइप void (*)(int, int) साथ उपयोग कर सकते हैं।

यदि आपको अपनी कक्षा के किसी भी गैर-स्थिर सदस्य का उपयोग करने की आवश्यकता है और आपको फ़ंक्शन पॉइंटर्स के साथ रहना होगा, जैसे कि फ़ंक्शन C इंटरफ़ेस का हिस्सा है, तो आपका सबसे अच्छा विकल्प हमेशा फ़ंक्शन पॉइंटर्स लेने के लिए आपके void* और अपने सदस्य को एक अग्रेषण फ़ंक्शन के माध्यम से कॉल करें जो ऑब्जेक्ट को void* से प्राप्त करता है void* और फिर सदस्य फ़ंक्शन को कॉल करता है।

एक उचित सी + + इंटरफ़ेस में आप फ़ंक्शन ऑब्जेक्ट के लिए मनमाना वर्ग प्रकारों का उपयोग करने के लिए अपने फ़ंक्शन को थ्रॉप्टेड तर्क के रूप में देख सकते हैं। यदि एक टेम्पलेट इंटरफ़ेस का उपयोग करना अवांछनीय है, तो आपको std::function<void(int, int)> जैसे कुछ का उपयोग करना चाहिए: आप इनके लिए उपयुक्त कॉल करने योग्य फ़ंक्शन ऑब्जेक्ट बना सकते हैं, उदाहरण के लिए, std::bind() का उपयोग कर।

क्लास प्रकार या एक उपयुक्त std::function<...> लिए एक टेम्पलेट तर्क का उपयोग कर टाइप-सुरक्षित दृष्टिकोण एक void* इंटरफ़ेस के उपयोग से बेहतर होते हैं क्योंकि वे गलत प्रकार के एक कलाकार के कारण त्रुटियों की संभावितता को निकालते हैं।

किसी सदस्य फ़ंक्शन को कॉल करने के लिए फ़ंक्शन पॉइंटर का उपयोग कैसे करें, यह एक उदाहरण है:

 // the function using the function pointers: void somefunction(void (*fptr)(void*, int, int), void* context) { fptr(context, 17, 42); } void non_member(void*, int i0, int i1) { std::cout << "I don't need any context! i0=" << i0 << " i1=" << i1 << "\n"; } struct foo { void member(int i0, int i1) { std::cout << "member function: this=" << this << " i0=" << i0 << " i1=" << i1 << "\n"; } }; void forwarder(void* context, int i0, int i1) { static_cast<foo*>(context)->member(i0, i1); } int main() { somefunction(&non_member, 0); foo object; somefunction(&forwarder, &object); } 

@ पेटी बेकर का उत्तर ठीक है लेकिन आप इसे सी ++ 11 में function1 1 के लिए एक स्पष्ट पैरामीटर के रूप में क्लास इंस्टेंस को पास किए बिना भी कर सकते हैं:

 #include <functional> using namespace std::placeholders; void function1(std::function<void(int, int)> fun) { fun(1,1); } int main (int argc, const char * argv[]) { ... aClass a; auto fp = std::bind(&aClass::test, a, _1, _2); function1(fp); return 0; } 

सदस्य फ़ंक्शन के लिए एक सूचक एक सूचक से कार्य करने के लिए अलग है। किसी सूचक फ़ंक्शन को एक सूचक के माध्यम से उपयोग करने के लिए आपको इसे (स्पष्ट रूप से) और एक ऑब्जेक्ट पर लागू करने के लिए एक पॉइंटर की आवश्यकता होती है। तो function1 का उपयुक्त संस्करण होगा

 void function1(void (aClass::*function)(int, int), aClass& a) { (a.*function)(1, 1); } 

और इसे कॉल करने के लिए:

 aClass a; // note: no parentheses; with parentheses it's a function declaration function1(&aClass::test, a);