2010-08-26 21 views
6

पर ऑब्जेक्ट्स आवंटित ऑब्जेक्ट्स के लिए shared_from_this को कॉल करने के बारे में क्या? आधार वर्ग सूची में enable_shared_from_this व्युत्पन्न वर्ग के उपयोगकर्ता के लिए केवल ढेर पर बनाने के लिए संकेतक है (और हम केवल सही वर्ग उपयोग के लिए आशा करते हैं) या हम ऐसी त्रुटियों के खिलाफ कुछ और मजबूत सुरक्षा प्राप्त कर सकते हैं? या मुझे कुछ पलों को समझ में नहीं आता?

उदाहरण कोड: enable_shared_from_this और स्टैक

 
class C : public enable_shared_from_this<C> 
{ 
public: 
    shared_ptr<C> method() { shared_from_this(); } 
};

void func() { C c; shared_ptr<C> ptr = c.method(); // exception comming from shared_from_this() }

+1

आप वास्तव में क्या पूछ रहे हैं? क्या आप जानना चाहते हैं कि स्टैक-आवंटित ऑब्जेक्ट्स पर 'shared_from_this()' को कॉल करने से रोकने का कोई तरीका है या नहीं? –

उत्तर

10

तो इस समस्या के खिलाफ की रक्षा करने के लिए आप अपने contstructors निजी बना सकते हैं और केवल निर्माण कार्यों कि वापसी shared_ptr प्रदान करते हैं - इस तरह से वस्तु ढेर पर आवंटित नहीं किया जा सकता, इस तरह:

class C : public enable_shared_from_this<C> 
{ 
public: 
    static shared_ptr<C> create() { return shared_ptr<C>(new C()); } 
    shared_ptr<C> method() { shared_from_this(); } 

private: 
    C() {...} 

    // Make operator= and C(const C&) private unimplemented 
    // so the used cant do bad things like C c(* c_ptr); 
    C& operator=(const C &); 
    C(const C &); 
}; 


void func() 
{ 
    C c; // This doesnt compile 
    shared_ptr<C> ptr = c.method(); // So you can never get this 
} 

void altfunc() 
{ 
    shared_ptr<C> c_ptr = C::create(); 
    C & c_ref = *c; 
    shared_ptr<C> ptr = c_ref.method(); // OK 
} 

आप अपने आप को मिल जाए anoperator के लिए बधाई देने के लिए = आप एक निजी कार्यान्वित प्रतिलिपि निर्माता का उपयोग कर एक क्लोन समारोह, इस

// This goes in class C 
shared_ptr<C> C::clone() const 
{ 
    return shared_ptr<C>(new C(*this)); 
} 

// This is how you can use it 
shared_ptr<C> c2 = c1->clone(); 
की तरह कुछ प्रदान कर सकते हैं
+0

मुझे पता है कि आप शायद इन स्टैक पर आवंटित कर सकते हैं यदि आप जानबूझकर बुराई के लिए कुछ हुप्स से कूदने के इच्छुक हैं .. लेकिन IMHO यह सबसे निर्दोष गलतियों से बचाता है। –

+0

तो हम शुरुआत में हीप-केवल कक्षाएं तैयार करेंगे ... क्या इस दृष्टिकोण का व्यापक रूप से उपयोग किया जाता है? – cybevnm

+0

आपको असाइनमेंट ऑपरेटर को अक्षम करने की आवश्यकता क्यों है? साझा_ptr में आयोजित वस्तुओं को/से असाइन करना सामान्य रूप से ठीक है। इसे दो * मौजूदा * ऑब्जेक्ट्स के बीच किसी अन्य असाइनमेंट के समान ही संभाला जाएगा - संदर्भ संख्या प्रभावित नहीं होगी। असाइनमेंट के बाद दो * अलग * ऑब्जेक्ट्स में एक ही सामग्री होगी। – nobar

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