2013-08-09 9 views
13

पैरामीटर के रूप में क्लास सदस्य फ़ंक्शन में पॉइंटर पास करना मैंने एक छोटा प्रोग्राम लिखा है जहां मैं कक्षा के सदस्य फ़ंक्शन को किसी अन्य फ़ंक्शन में पॉइंटर पास करने का प्रयास कर रहा हूं। क्या आप कृपया मेरी मदद कर सकते हैं और कहां गलत हो रहा हूं ..?पैरामीटर

#include<iostream> 
using namespace std; 
class test{ 
public: 
     typedef void (*callback_func_ptr)(); 
     callback_func_ptr cb_func; 

     void get_pc(); 

     void set_cb_ptr(void * ptr); 

     void call_cb_func(); 
}; 
void test::get_pc(){ 
     cout << "PC" << endl; 
} 
void test::set_cb_ptr(void *ptr){ 
     cb_func = (test::callback_func_ptr)ptr; 
} 
void test::call_cb_func(){ 
      cb_func(); 
} 
int main(){ 
     test t1; 
      t1.set_cb_ptr((void *)(&t1.get_pc)); 
     return 0; 
} 

जब मैं इसे संकलित करने का प्रयास करता हूं तो मुझे निम्न त्रुटि मिलती है।

error C2276: '&' : illegal operation on bound member function expression 
+0

मुझे हमेशा http://www.newty.de/fpt/index.html बहुत उपयोगी लगता है। – arne

+2

सदस्य कार्य कार्य नहीं हैं। आपको जिस प्रकार की आवश्यकता है वह 'शून्य (परीक्षण :: *) (शून्य *)' –

+1

केरेक एसबी सही है। हालांकि यदि आप अलग-अलग वर्गों और उदाहरणों के लिए एक ही सदस्य को कॉल करना चाहते हैं तो आपको विरासत और वर्चुअल के बारे में सोचना चाहिए ... –

उत्तर

19

आप void* करने के लिए एक समारोह सूचक डाली नहीं कर सकता।

आप एक समारोह सूचक एक सदस्य समारोह को इंगित करने के आप प्रकार की घोषणा के रूप में

ReturnType (ClassType::*)(ParameterTypes...) 

इसके अलावा आप एक बाध्य सदस्य समारोह, उदा करने के लिए एक समारोह सूचक की घोषणा नहीं कर सकते हैं चाहिए चाहते हैं

func_ptr p = &t1.get_pc // Error 

इसके बजाय आप इस तरह पता प्राप्त करना होगा: जब आप एक समारोह सूचक एक सदस्य समारोह की ओर इशारा करते के लिए एक फोन करना

func_ptr p = &test::get_pc // Ok, using class scope. 

अंत में, आप वर्ग का एक उदाहरण के साथ इसे कॉल करना होगा कि समारोह का सदस्य है। उदाहरण के लिए:

#include <iostream> 

class test { 
public: 
    typedef void (test::*callback_func_ptr)(); 
    callback_func_ptr cb_func; 
    void get_pc(); 
    void set_cb_ptr(callback_func_ptr ptr); 
    void call_cb_func(); 
}; 

void test::get_pc() { 
    std::cout << "PC" << std::endl; 
} 

void test::set_cb_ptr(callback_func_ptr ptr) { 
    cb_func = ptr; 
} 

void test::call_cb_func() { 
    (this->*cb_func)(); 
} 

int main() { 
    test t1; 
    t1.set_cb_ptr(&test::get_pc); 
    t1.call_cb_func(); 
} 
+1

शून्य परीक्षण :: call_cb_func() {(यह -> * cb_func)(); कोई भी वस्तु के भीतर से सूचक द्वारा फ़ंक्शन को कॉल नहीं करना चाहता। इस प्रकार उदाहरण में 'यह' एक पूरी तरह से बेकार स्पष्टीकरण है। यह देखते हुए कि सी ++ हेक्स से अलग संभवतः सबसे अमानवीय वाक्यविन्यास है, कोई भी अनुमान लगा सकता है कि किसी अन्य वस्तु से फ़ंक्शन को कैसे कॉल करें। –

2

SNPs के जवाब देने के लिए इसके अलावा, आप भी एक function wrapper सी ++ 11 से प्रयोग कर एक लैम्ब्डा स्टोर करने के लिए कर सकते हैं:

(this->*cb_func)(); // Call function via pointer to current instance. 

यहाँ पूर्ण उदाहरण के सभी परिवर्तनों के साथ लागू है समारोह:

#include <iostream> 
#include <functional> 

class test 
{ 
    public: 
    std::function<void()> Func; 
    void get_pc(); 
    void call_cb_func(); 
    void set_func(std::function<void()> func); 
}; 

void test::get_pc() 
{ 
    std::cout << "PC" << std::endl; 
} 

void test::call_cb_func() 
{ 
    Func(); 
} 

void test::set_func(std::function<void()> func) 
{ 
    Func = func; 
} 

int main() { 
    test t1; 
    t1.set_func([&](){ t1.get_pc(); }); 
    t1.call_cb_func(); 
}