2012-09-06 11 views
5

मैं पॉइंटर्स के साथ कुछ करने की कोशिश कर रहा हूं जो सदस्यों को काम नहीं कर सकता है कि मैं यह नहीं समझ सकता कि यह कैसे काम करता है।फ़ंक्शन सदस्य

मैं एक वर्ग एक है कि इस

class A 
{ 
    public: 
    float Plus (float a, float b) { return a+b; } 
    float Minus (float a, float b) { return a-b; } 
    float Multiply(float a, float b) { return a*b; } 
    float Divide (float a, float b) { return a/b; } 
}; 

मैं एक करने के लिए एक सूचक की घोषणा और फिर एक और कार्य करने के लिए ए के सदस्यों में से एक के लिए एक समारोह सूचक पास करना चाहते हैं तरह दिखता है

void Will_Get_Function_Pointer(float a, float b, float (A::*pt2Func)(float, float)) 
{ 
    (...) 
} 

कहाँ मैं इसे इस

01 की तरह कुछ के साथ कहेंगे: कुछ ने इसे पसंद किया

मैं कुछ है कि इस

vector<A> vecA; 
myA = &vecA[xxx] 

ऐसा करने की तरह दिखाई देगा में एक वस्तुओं का संग्रह में क्योंकि मेरा अंतिम कार्यान्वयन एक में स्थिर/स्थिरांक सदस्यों उपयोग नहीं कर सकते एक विशिष्ट एक को इंगित करेगा बुरी तरह विफल रहता है

typedef float (A::*pA)(float x, float y); 
pA p = &myA->Minus; 

और संकलक मुझे मेरे लिए & एक :: माइनस लेकिन यह अभ्यस्त काम का उपयोग करने में बताता है।

क्या मैं यह भी कर सकता हूं?

चीयर्स

उत्तर

6
A* myA = new A; 
Will_Get_Function_Pointer(1.00,2.00, &myA->Minus) 

आप नहीं कर सकते। आप की तरह

void Will_Get_Function_Pointer(A* object, float a, float b, 
float (A::*pt2Func)(float, float)) 
{ 
    (object->*pt2Func)(a, b); 
} 

कुछ का उपयोग और

A* myA = new A; 
Will_Get_Function_Pointer(myA, 1.00, 2.00, &A::Minus); 

सरल उदाहरण के रूप में यह कहता है चाहिए।

http://liveworkspace.org/code/79939893695e40f1761d81ba834c5d15

+0

@ForEverT धन्यवाद! यह बहुत अच्छा काम किया! –

2

दुर्भाग्य से, भाषा आप उस वाक्य विन्यास का उपयोग करने के लिए सदस्य कार्य करने के लिए एक वस्तु बाध्य करने के लिए एक प्रतिदेय वस्तु बनाने के लिए अनुमति नहीं है। आप एक वस्तु संदर्भ (या सूचक) में पारित कर सकते हैं या तो और यह बाँध जब आप कॉल समारोह:

void Will_Get_Function_Pointer(float a, float b, A & obj, float (A::*pt2Func)(float, float)) 
{ 
    (obj.pt2Func)(a,b); 
} 

Will_Get_Function_Pointer(1.00, 2.00, myA, &A::Minus); 

या आप एक समारोह उद्देश्य यह है कि वस्तु के लिए समारोह सूचक बांधता बना सकते हैं:

void Will_Get_Function(float a, float b, std::function<float(float,float)> f) 
{ 
    f(a,b); 
} 

Will_Get_Function(1.00, 2.00, std::bind(&A::Minus, &myA)); 

ध्यान दें कि function और bind सी ++ 11 में नए हैं; यदि आप भाषा के पुराने संस्करण से फंस गए हैं तो बूस्ट समकक्ष प्रदान करता है।

+0

+1 बाइंड के लिए +1 - फ़ंक्शंस के संदर्भों से निपटने पर अक्सर यह कार्य करने के लिए होता है। – Marcin

+0

सी ++ 11 या बूस्ट का उपयोग नहीं कर सकता है। लेकिन यह वास्तव में सिंडैक्स बहुत अच्छा है। –

2

Use a macro.

#define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember)) 

अपने सदस्य समारोह कॉलिंग सरल है, क्योंकि आप समारोह आप कॉल करना चाहते के लिए already have a typedef

float result = CALL_MEMBER_FN(*myA, pA)(a, b); 
+0

सदस्य फ़ंक्शंस को अंक घोषित करने के लिए अक्सर पूछे जाने वाले प्रश्नों पर ध्यान न दें: [टाइपेडफ का उपयोग करें] (http://www.parashift.com/c++-faq-lite/typedef-for-ptr-to-memfn। एचटीएमएल)। –

+0

मुझे लगता है कि 'CALL_MEMBER_FN (* myA, pA) (x, y) होना चाहिए; 'चूंकि, इसके नाम के बावजूद, आपका मैक्रो कुछ भी नहीं करता है। व्यक्तिगत रूप से, मुझे उस गड़बड़ की तुलना में '(myA-> pA) (x, y) 'और अधिक पठनीय मिलेगा। –

+0

ओह, आप बिल्कुल सही हैं। फिक्स्ड। –