मेरे पास एक क्लास ए है जिसमें सदस्य फ़ंक्शन foo() और bar() शामिल हैं जो दोनों कक्षा बी में पॉइंटर लौटाते हैं। मैं फंक्शन और बार फ़ंक्शन वाले एरे को कैसे घोषित कर सकता हूं कक्षा ए में सदस्य चर के रूप में? और मैं सरणी के माध्यम से कार्यों को कैसे कॉल करूं?सी ++: विभिन्न कार्यों के लिए सदस्य फ़ंक्शन पॉइंटर्स का ऐरे
उत्तर
सदस्य समारोह सूचक वाक्य रचना ReturnType (Class::*)(ParameterTypes...)
है, इसलिए उदा .:
typedef B* (A::*MemFuncPtr)(); // readability
MemFuncPtr mfs[] = { &A::foo, &A::bar }; // declaring and initializing the array
B* bptr1 = (pointerToA->*mfs[0])(); // call A::foo() through pointer to A
B* bptr2 = (instanceOfA.*mfs[0])(); // call A::foo() through instance of A
उदा देखें सदस्यों को पॉइंटर्स पर अधिक जानकारी के लिए this InformIT article।
तुम भी Boost.Bind और Boost.Function (या उनके समकक्ष TR1) जो आप अस्पष्टता से एक उदाहरण के लिए सदस्य-समारोह-संकेत बाध्य करने के लिए अनुमति देते हैं पर गौर करना चाह सकते हैं:
typedef boost::function<B*()> BoundMemFunc;
A instanceOfA;
BoundMemFunc mfs[] = {
boost::bind(&A::foo, &instanceOfA),
boost::bind(&A::bar, &instanceOfA)
};
B* bptr = mfs[0](); // call A::foo() on instanceOfA
एक के रूप में इस तरह के एक सरणी का उपयोग करने के सदस्य, ध्यान दें कि आप सदस्य प्रारंभकर्ता सूची का उपयोग करके सरणी प्रारंभ नहीं कर सकते हैं। इस प्रकार आप या तो निर्माता शरीर में इसे करने के लिए प्रदान कर सकते हैं:
A::A {
mfs[0] = &A::foo;
}
... या आप एक प्रकार है कि वास्तव में std::vector
या boost::array
की तरह वहाँ से प्रारंभ किया जा सकता है का उपयोग करें:
struct A {
const std::vector<MemFuncPtr> mfs;
// ...
};
namespace {
std::vector<MemFuncPtr> init_mfs() {
std::vector<MemFuncPtr> mfs;
mfs.push_back(&A::foo);
mfs.push_back(&A::bar);
return mfs;
}
}
A::A() : mfs(init_mfs()) {}
आप क्या देख रहे हैं सदस्य कार्यों के लिए पॉइंटर्स हैं।
#include <iostream>
class B {
public:
B(int foo): foo_(foo) {
std::cout << "Making a B with foo_ = " << foo_ << std::endl;
}
~B(void) {
std::cout << "Deleting a B with foo_ = " << foo_ << std::endl;
}
int foo_;
};
class A {
public:
A(void) {
funcs_[0] = &A::foo;
funcs_[1] = &A::bar;
}
B* foo(void) {
return new B(3);
}
B* bar(void) {
return new B(5);
}
// Typedef for the member function pointer, for everyone's sanity.
typedef B* (A::*BMemFun)(void);
BMemFun funcs_[2];
};
int main(int argc, char *argv[]) {
A a;
for (int i = 0; i < 2; ++i) {
A::BMemFun func = a.funcs_[i];
// Call through the member function pointer (the .* operator).
B* b = (a.*func)();
delete b;
}
return 0;
}
C++ FAQ section on pointers to member functions वह जगह है जहाँ मैं यह सब जानकारी मिली: यहाँ एक छोटा नमूना है कि उनके घोषणा और उपयोग से पता चलता है।
- 1. सदस्य-फ़ंक्शन पॉइंटर्स और विरासत
- 2. std :: सदस्य फ़ंक्शन पॉइंटर्स का मानचित्र?
- 3. सदस्य फ़ंक्शन पॉइंटर्स के लिए टेम्पलेट तर्क कटौती
- 4. सी ++ पॉइंटर्स का ऐरे: हटाएं या हटाएं []?
- 5. आभासी सदस्य फ़ंक्शन पॉइंटर्स के साथ decltype का उपयोग
- 6. सदस्य कार्यों के लिए decltype
- 7. कई कार्यों के पॉइंटर्स
- 8. पॉइंटर्स के साथ ऐरे लम्बाई
- 9. कार्यों का ऐरे?
- 10. सी फ़ंक्शन पॉइंटर्स
- 11. ऐरे (रिकॉर्ड करने के लिए पॉइंटर्स)
- 12. सी पुस्तकालयों से कॉलिंग सी ++ फ़ंक्शन पॉइंटर्स
- 13. सी/सी ++ फ़ंक्शन पॉइंटर्स के लिए यूएमएल प्रतिनिधित्व
- 14. विभिन्न प्रकार के बढ़ावा कार्यों का नक्शा?
- 15. टेम्पलेट वर्ग के सदस्य फ़ंक्शन के लिए फ़ंक्शन पॉइंटर? (सी ++)
- 16. विभिन्न प्रकार के कार्यों के लिए शब्दावली
- 17. फ़ंक्शन पॉइंटर्स
- 18. आभासी सदस्य कार्यों के लिए पॉइंटर्स। यह कैसे काम करता है?
- 19. सी # में फ़ंक्शन पॉइंटर्स हैं?
- 20. सी ++ सदस्य फंक्शन के लिए कॉल पॉइंटर
- 21. सी - एड्रेस ऑपरेटर "अनावश्यक" में फ़ंक्शन पॉइंटर्स
- 22. ऐरे के लिए ऐरे का == फ़ंक्शन क्यों सही नहीं है (1,2) == ऐरे (1,2)?
- 23. किसी सदस्य फ़ंक्शन को पॉइंटर पास करने के लिए
- 24. सी ++/सी फ़ंक्शन पॉइंटर्स जो शून्य *
- 25. सी ++: सदस्य फ़ंक्शंस
- 26. सदस्य फ़ंक्शन के लिए फ़ंक्शन पॉइंटर
- 27. सी ++ विभिन्न नामस्थानों में कार्यों के लिए संदिग्ध कॉल
- 28. फ़ंक्शन पॉइंटर्स प्रकार असुरक्षित
- 29. फ़ंक्शन सदस्य
- 30. दूर फ़ंक्शन पॉइंटर्स का उपयोग
आप std :: function का अच्छा उपयोग भी कर सकते हैं। – Puppy
@DeadMG: मैंने TR1 संस्करण का उल्लेख किया लेकिन बूस्ट संस्करण के लिए गया क्योंकि इसकी व्यापक उपलब्धता है। मैं व्यक्तिगत रूप से सी ++ 0x संस्करणों को व्यापक रूप से व्यापक रूप से नहीं मानता हूं और नए मानक को अभी तक अंतिम रूप दिया नहीं गया है। –
आह, तो आपने किया। चूंकि मुझे स्वयं एक सी ++ 0 एक्स कंपाइलर मिला है, इसलिए मुझे बूस्ट वेरिएंट देखने के लिए उपयोग नहीं किया जाता है। – Puppy