2014-10-13 11 views
14

कहा जाना चाहिए I C++ (सी ++ 11 नहीं) का उपयोग कर रहा हूं। मुझे कक्षा के अंदर एक समारोह में एक सूचक बनाने की जरूरत है। मैं निम्नलिखित करने की कोशिश करता हूं:गैर स्थैतिक सदस्य फ़ंक्शन के संदर्भ को

void MyClass::buttonClickedEvent(int buttonId) { 
    // I need to have an access to all members of MyClass's class 
} 

void MyClass::setEvent() { 

    void (*func) (int); 
    func = buttonClickedEvent; // <-- Reference to non static member function must be called 

} 

setEvent(); 

लेकिन एक त्रुटि है: "गैर स्थैतिक सदस्य समारोह के संदर्भ को" "कहा जाना चाहिए। MyClass के किसी सदस्य को पॉइंटर बनाने के लिए मुझे क्या करना चाहिए?

+2

आपके पास सदस्य फ़ंक्शन को असाइन किए गए फ़ंक्शन पॉइंटर नहीं हो सकते हैं। आपको या तो सदस्य, या एक नि: शुल्क फ़ंक्शन के लिए पॉइंटर का उपयोग करना होगा। – imreal

+0

"सदस्य के लिए सूचक" से आपका क्या मतलब है? "फ्री फ़ंक्शन" के लिए आप एक कक्षा के बाहर एक समारोह का मतलब था? हाँ, मुझे पता है कि यह काम करेगा यदि मैं परिभाषा "शून्य MyClass :: buttonClickedEvent ..." से "MyClass ::" भाग को हटा दूंगा, लेकिन मुझे "buttonClickedEvent" फ़ंक्शन के अंदर MyClass के सदस्यों तक पहुंच की आवश्यकता है .. – JavaRunner

उत्तर

16

समस्या यह है कि buttonClickedEvent सदस्य कार्य है और आपको इसे आमंत्रित करने के लिए सदस्य को सूचक की आवश्यकता है। आप कर सकते हैं

(this->*func)(<argument>); 

http://www.codeguru.com/cpp/cpp/article.php/c17401/C-Tutorial-PointertoMember-Function.htm

+1

वैसे, जब मैं इसे कॉल करता हूं -> * func (23) - यह काम नहीं करता है क्योंकि मुझे इसे इस तरह के कोष्ठक के साथ उपयोग करने की आवश्यकता है: (यह -> * func) (23) – JavaRunner

5

: उदाहरण के this के लिए

void (MyClass::*func)(int); 
func = &MyClass::buttonClickedEvent; 

और फिर जब आप इसे आह्वान, आप प्रकार MyClass की एक वस्तु की जरूरत है ऐसा करने के लिए,:

इस प्रयास करें https://isocpp.org/wiki/faq/pointers-to-members#fnptr-vs-memfnptr-types पर विशेष रूप से देखना चाहते हैं, खासकर [33.1] "पॉइंटर-टू-सदस्य" का प्रकार है -फंक्शन "पॉइंटर-टू-फ़ंक्शन" से अलग है?

+0

धन्यवाद! मेरे लिए बहुत उपयोगी जानकारी। – JavaRunner

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