2016-03-04 7 views
6

में सदस्य फ़ंक्शन पॉइंटर मैंने std :: shared_pointer को डिलीटर के साथ उपयोग करने का प्रयास किया। मैंने एक सदस्य समारोह को हटाने के रूप में उपयोग करने की कोशिश की। हालांकि यह संकलित नहीं किया जा सका। कंपाइलर ने मुझे एक त्रुटि संदेश दिया लेकिन मुझे समझ में नहीं आया कि यह क्यों काम नहीं कर रहा था। क्या कोई जानता है कि यह क्यों काम नहीं करता? आपका बहुत बहुत धन्यवाद।कन्स्ट्रक्टर

सरलीकृत कोड पीछा कर रहा है,

#include <memory> 

class MemberFunctionPointerInConstructor { 
public: 
    MemberFunctionPointerInConstructor(void) { 
     std::shared_ptr<int> a = std::shared_ptr<int>(new int(1), deleter); // this line makes a compiler error message 
    } 

    void deleter(int* value) { 
     delete value; 
    } 
}; 

संकलक से त्रुटि संदेश पीछा कर रहा है,

error: invalid use of non-static member function 
std::shared_ptr<int> a = std::shared_ptr<int>(new int(1), deleter); 
                   ^

आपको बहुत बहुत धन्यवाद।

उत्तर

3

आप है चाहते हैं आप एक Deleter के रूप में एक गैर स्थिर सदस्य समारोह उपयोग करना चाहते हैं , आपको इसे — पर एक उदाहरण के साथ बाध्य करना होगा, लेकिन ध्यान दें कि हटाए जाने पर इंस्टेंस को जीवित रहने की आवश्यकता होगी। उदाहरण के लिए,

class ShorterName { 
public: 
    ShorterName(void) { 
     using namespace std::placeholders; 
     auto a = std::shared_ptr<int>(new int(1), 
        std::bind(&A::deleter, this, _1)); 
    } 

    void deleter(int* value) { 
     delete value; 
    } 
}; 

आप एक विशेष उदाहरण की जरूरत नहीं है, तो आप समारोह स्थिर कर सकते हैं, तो यह एक उदाहरण की आवश्यकता नहीं है।

class ShorterName { 
public: 
    ShorterName(void) { 
     auto a = std::shared_ptr<int>(new int(1), deleter); 
    } 

    static void deleter(int* value) { 
     delete value; 
    } 
}; 
+0

धन्यवाद याम मार्कोविच। – mora

8

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

static void deleter(int* value) { 
    delete value; 
} 
+0

लवली सरल जवाब। :) – erip

+0

एक केंद्रित उत्तर के लिए CoryKramer धन्यवाद। – mora

3

इसे हल करने के कई तरीके हैं। आप वास्तव में एक गैर स्थिर सदस्य समारोह है, तो (न केवल एक) ऐसा करने का एक ही रास्ता है मतलब अगर एक lambda function के माध्यम से होगा:

class MemberFunctionPointerInConstructor { 
public: 
    MemberFunctionPointerInConstructor() { 
     std::shared_ptr<int> a = std::shared_ptr<int>(
      new int(1), 
      [this](int *p){this->deleter(p);}); 
    } 

    void deleter(int* value) { 
     delete value; 
    } 
}; 
+0

धन्यवाद अमी टेवरी फिर से। यह मेरे लिए सबसे अच्छा जवाब है। मुझे आपको एक और पक्ष पूछने दो। अगर मैं लैम्डा का उपयोग करता हूं, तो क्या यह अपने लैम्डा ऑब्जेक्ट में पॉइंटर पी की अतिरिक्त मेमोरी लेता है? मैं स्मृति आकार पर उत्सुक हूँ। – mora

+0

@mora बिल्कुल सही नहीं है कि आपका क्या मतलब है। 'पी' एक * प्लेसहोल्डर * है - यह कहता है" जब आप जानते हैं कि आप किस पी को हटाना चाहते हैं, तो इस फ़ंक्शन को इसके साथ कॉल करें "। लैम्ब्डा 'इस' को स्टोर करेगा, हालांकि - इसे याद रखना होगा। –

+0

उत्तर देने के लिए धन्यवाद। जो मैं चाहता था वह आकार था (सदस्य फ़ंक्शनप्रिंटरइंटरस्ट्रक्टर)। जब मैंने आपसे पूछा तो मैं आकार (...) द्वारा परीक्षण के बारे में नहीं सोच सका। यह 1 था। इसमें दो पॉइंटर्स शामिल नहीं हैं, * यह न ही * पी। वैसे भी आपको धन्यवाद। – mora

1

जवाब बहुत सरल है।

static void deleter(int* value) { 
    delete value; 
} 

आप समारोह स्थिर करना चाहिए, क्योंकि अन्यथा यह है कि वर्ग है, जो केवल यदि कोई उदाहरण के लिए इसके साथ किया जाना है, और यहाँ यह मामला नहीं है किया जा सकता है के सदस्य चर का उपयोग हो सकता है।

+0

धन्यवाद मार्सी एसजे। – mora

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