2010-03-08 13 views
15

में घोषित किए जाने पर कॉलबैक फ़ंक्शंस को स्थिर होने की आवश्यकता क्यों है मैं कक्षा में कॉलबैक फ़ंक्शन घोषित करने की कोशिश कर रहा था और फिर कहीं मैंने फ़ंक्शन को स्थिर होने की आवश्यकता है लेकिन यह समझा नहीं गया क्यों?कक्षा

#include <iostream> 
using std::cout; 
using std::endl; 

class Test 
{ 
public: 
    Test() {} 

    void my_func(void (*f)()) 
    { 
     cout << "In My Function" << endl; 
     f(); //Invoke callback function 
    } 

    static void callback_func() 
    {cout << "In Callback function" << endl;} 
}; 

int main() 
{ 
    Test Obj; 
    Obj.my_func(Obj.callback_func); 
} 

उत्तर

20

एक सदस्य फ़ंक्शन एक ऐसा फ़ंक्शन है जिसे कक्षा के उदाहरण की आवश्यकता होती है। सदस्यों के फ़ंक्शन को कॉल करने के लिए उदाहरण प्रदान किए बिना बुलाया नहीं जा सकता है। इससे कभी-कभी उपयोग करना मुश्किल हो जाता है।

एक स्थिर कार्य लगभग वैश्विक कार्य की तरह है: इसे कक्षा के उदाहरण की आवश्यकता नहीं है। तो आपको इसे कॉल करने में सक्षम होने के लिए केवल फ़ंक्शन पर पॉइंटर प्राप्त करने की आवश्यकता है।

std :: function (या std :: tr1 :: फ़ंक्शन या बूस्ट :: फ़ंक्शन अगर आपका कंपाइलर अभी तक प्रदान नहीं करता है) पर एक नज़र डालें, यह आपके मामले में उपयोगी है क्योंकि यह आपको कुछ भी उपयोग करने की अनुमति देता है कॉल करने योग्य ऑब्जेक्ट्स और सदस्य फ़ंक्शंस सहित कॉलबैक के रूप में कॉल करने योग्य (प्रदान करने वाला) सिंटैक्स या ऑपरेटर है (इस मामले के लिए std :: bind या boost :: bind देखें)।

8

कॉलबैक को स्थैतिक होने की आवश्यकता है ताकि उनके पास this पैरामीटर को उनके फ़ंक्शन हस्ताक्षर में पहला तर्क न हो।

0

यदि आप फ़ंक्शन पॉइंटर्स का उपयोग करते हैं, तो रनटाइम वातावरण फ़ंक्शन को कॉल करते समय किसी उदाहरण के संदर्भ को पास नहीं कर सकता है। लेकिन आप fund :: mem_fun <> का उपयोग कर सकते हैं, फ़ैक्टर और सदस्य विधियों का उपयोग करने के लिए।

2

इसे स्थैतिक होने की आवश्यकता है ताकि फ़ंक्शन हस्ताक्षर मिलान हो। जब किसी सदस्य फ़ंक्शन को कॉल किया जाता है, तो कॉल में एक छुपा पैरामीटर शामिल होता है (यानी "यह" पॉइंटर)। स्थिर सदस्य कार्य में यह सूचक एक पैरामीटर के रूप में पारित नहीं किया जाता है।

4

गैर स्थैतिक विधियों को 'इस' उदाहरण की आवश्यकता होती है, और केवल ऑब्जेक्ट इंस्टेंस पर ही बुलाया जा सकता है।

हालांकि, गैर स्थैतिक कॉलबैक का उपयोग करना संभव है, लेकिन वे लिखने के लिए वाक्य रचनात्मक रूप से कठिन हैं। स्पष्टीकरण के लिए http://www.newty.de/fpt/callback.html#member देखें।

2

मार्शल क्लाइन आपको पूरा उत्तर here देता है। पूरे खंड में आपको जो कुछ जानने की आवश्यकता है, वह सब कुछ शामिल है।

संक्षेप में यह समझाया जा सकता है कि आपको स्थिर सदस्य की आवश्यकता है क्योंकि this पॉइंटर की आवश्यकता नहीं है (सामान्य सदस्य विधियों के विपरीत)। लेकिन यह भी शामिल है कि एक स्थिर का उपयोग सभी कंपाइलरों के लिए पर्याप्त नहीं हो सकता है क्योंकि सी ++ कॉलिंग सम्मेलन सी और सी ++ के बीच अलग हो सकता है।

तो सिफारिश extern "C" गैर-सदस्य फ़ंक्शन का उपयोग करना है।

+1

आपका लिंक टूटा हुआ है। साथ ही, लिंक के बजाय वास्तविक उत्तरों पोस्ट करना बेहतर है। –

+0

@BenH हेड-अप के लिए धन्यवाद। बेहतर उत्तर और निश्चित लिंक। – daramarak

+0

प्लस वन लिंक के लिए (बहुत उपयोगी और स्पष्टीकरण समझने में आसान) –