2010-08-25 20 views
6

मेरे पास एक क्लास ए है जिसमें सदस्य फ़ंक्शन foo() और bar() शामिल हैं जो दोनों कक्षा बी में पॉइंटर लौटाते हैं। मैं फंक्शन और बार फ़ंक्शन वाले एरे को कैसे घोषित कर सकता हूं कक्षा ए में सदस्य चर के रूप में? और मैं सरणी के माध्यम से कार्यों को कैसे कॉल करूं?सी ++: विभिन्न कार्यों के लिए सदस्य फ़ंक्शन पॉइंटर्स का ऐरे

उत्तर

17

सदस्य समारोह सूचक वाक्य रचना 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()) {} 
+0

आप std :: function का अच्छा उपयोग भी कर सकते हैं। – Puppy

+0

@DeadMG: मैंने TR1 संस्करण का उल्लेख किया लेकिन बूस्ट संस्करण के लिए गया क्योंकि इसकी व्यापक उपलब्धता है। मैं व्यक्तिगत रूप से सी ++ 0x संस्करणों को व्यापक रूप से व्यापक रूप से नहीं मानता हूं और नए मानक को अभी तक अंतिम रूप दिया नहीं गया है। –

+0

आह, तो आपने किया। चूंकि मुझे स्वयं एक सी ++ 0 एक्स कंपाइलर मिला है, इसलिए मुझे बूस्ट वेरिएंट देखने के लिए उपयोग नहीं किया जाता है। – Puppy

2

आप क्या देख रहे हैं सदस्य कार्यों के लिए पॉइंटर्स हैं।

#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 वह जगह है जहाँ मैं यह सब जानकारी मिली: यहाँ एक छोटा नमूना है कि उनके घोषणा और उपयोग से पता चलता है।

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