2011-01-04 8 views
8

में कमजोर सूचक यह समझता है कि किसी वर्ग के निर्माता से shared_from_this() को कॉल करके साझा_ptr प्राप्त करना संभव नहीं है, क्योंकि ऑब्जेक्ट अभी तक नहीं बनाया गया है। क्या यह संभव है कि कन्स्ट्रक्टर से ऑब्जेक्ट को कमजोर_पीआरआर प्राप्त करें? "Boost_from_raw()" विधि पर चर्चा करने वाले कुछ बूस्ट फ़ोरम पोस्ट से पता चलता है कि यह संभव हो सकता है।कन्स्ट्रक्टर

संपादित करें: बूस्ट रूप weak_from_raw http://lists.boost.org/boost-users/2010/08/61541.php

+0

क्या आप 'weak_from_raw() 'पर चर्चा करने वाले फ़ोरम पोस्ट पर एक लिंक पोस्ट कर सकते हैं? –

+0

ऐसा मत सोचो, "weak_ptr किसी ऑब्जेक्ट को" कमजोर संदर्भ "संग्रहीत करता है जो पहले से ही shared_ptr द्वारा प्रबंधित किया जाता है"। – ronag

+0

@ सैम http://groups.google.com/group/boost-list/browse_thread/thread/36d8e06194227408/5625f636b47fdb96?pli=1 – James

उत्तर

15

चर्चा कर मुझे लगता है कि तुम क्या is this संदर्भित कर रहे हैं। ऐसा लगता है कि बढ़ावा देने के लिए विलय नहीं किया गया है (इसके बारे में गलत हो सकता है)।

boost docs से:

सवाल जवाब

प्र एक वस्तु अपने निर्माता में ही करने के लिए एक weak_ptr बना सकता हूँ?

नहीं। एक कमजोर_पीटीआर केवल साझा_प्टर से बनाया जा सकता है, और ऑब्जेक्ट निर्माण समय पर ऑब्जेक्ट के लिए कोई shared_ptr अभी तक मौजूद नहीं है। यहां तक ​​कि यदि आप इसे अस्थायी shared_ptr बना सकते हैं, तो यह कन्स्ट्रक्टर के अंत में दायरे से बाहर हो जाएगा, और सभी कमजोर_पीआरआर उदाहरण तुरंत समाप्त हो जाएंगे।

समाधान निर्माता निजी बनाने के लिए, और एक कारखाने समारोह है कि एक shared_ptr रिटर्न आपूर्ति है:

class X 
{ 
private: 

    X(); 

public: 

    static shared_ptr<X> create() 
    { 
     shared_ptr<X> px(new X); 
     // create weak pointers from px here 
     return px; 
    } 
}; 
+0

उत्तर के लिए धन्यवाद, यह मेरे लिए उपयोगी था। मुझे लापता ब्रैकेट जोड़ने के लिए एक [संपादित अस्वीकृत] (https://stackoverflow.com/review/suggested-edits/17164598) मिला है ताकि आप इसे स्वयं करना चाहें :-) – PhilLab

+0

कोई लापता ब्रैकेट नहीं हैं;) नया एक्स 'डिफ़ॉल्ट-एक्स का एक उदाहरण शुरू करता है। कोष्ठक जोड़ना इसके बजाय प्रत्यक्ष-प्रारंभिक बनाता है (देखें http://en.cppreference.com/w/cpp/language/new) – James

+0

वाह, मैं हर दिन कुछ नया सीखता हूं। धन्यवाद – PhilLab

5

देखें: http://boost.org/doc/libs/1_42_0/libs/smart_ptr/sp_techniques.html#in_constructor

मुद्दा यह है कि वस्तु का निर्माण नहीं कर रहा है नहीं है। मुद्दा यह है कि साझा_प्टर का निर्माण नहीं किया गया है। यदि आप केवल एक साझा_ptr बनाना चाहते थे और इसे कहीं से भेजना चाहते थे तो सबकुछ ठीक होगा। यह तब होता है जब आप उस वस्तु को शामिल करने के लिए shared_ptr बनाने का प्रयास करते हैं जिसे आपने अभी बनाया है। दोनों को जोड़ने का कोई तरीका नहीं है और इस प्रकार आपको एक बड़ी समस्या है।

जिस तरह से साझा_from_this काम करता है वह यह है कि यह आपको उम्मीद है कि ऑब्जेक्ट को साझा करने के लिए साझा_from_this को कॉल करने से पहले साझा_from_this को कॉल करने से पहले। चूंकि आपने अभी तक ऐसा नहीं किया है, क्योंकि ऑब्जेक्ट का कन्स्ट्रक्टर समाप्त नहीं हुआ है और इस प्रकार shared_ptr इससे कनेक्ट नहीं है, आप shared_from_this को कॉल नहीं कर सकते हैं।

आप कमजोर_ptr के साथ बिल्कुल वही समस्या होगी।

तो, दूसरे शब्दों में, यह बेतुका निर्माण काम करेगा:

struct absurd 
{ 
    absurd() 
    { 
    register(shared_ptr<absurd>(this)); 
    } 
}; 

... 
new absurd; // better not assign to a shared_ptr!!! 

लेकिन क्या तुम सच में ऐसा करने के लिए नहीं करना चाहती।