2013-10-02 11 views
8

से कमजोर_पीआरआर <> बनाना, मैं विकासशील वर्ग के अंदर हटने से रोकने के लिए कच्चे सूचक सूचक को कुछ स्मार्ट सूचक में लपेटना चाहता हूं। सूचक के तहत वस्तु का मालिक वर्ग के बाहर है। तो, boost::shared_ptr और std::auto_ptr जैसा दिखता है ठीक नहीं है। निम्नलिखित एक कम उदाहरण है:कच्चे पॉइंटर

class Foo { 
    boost::weak_ptr<Bar> m_bar; 
public: 
    void setBar(const Bar *bar) { // bar created on heap 
    m_bar = bar;    // naturally compilation error 
    } 
}; 

बेशक, यह संकलन त्रुटि उत्पन्न करता है। कच्चे सूचक (यदि मौजूद है) से weak_ptr प्रारंभ करने का सही तरीका क्या है?

+0

[साझा \ _ptr और कमजोर \ _ptr के संभावित डुप्लिकेट कर सकते हैं रूपांतरण] (http://stackoverflow.com/questions/17522020/shared-ptr-weak-ptr-conversions) –

+1

यदि आप अपनी कक्षा के भीतर उस पॉइंटर को हटाने से रोकना चाहते हैं तो उस पर 'हटाएं' को कॉल न करें, और ग्राहकों को पॉइंटर का पर्दाफाश करने वाले एक्सेसर फ़ंक्शंस प्रदान न करें। 'weak_ptr' का मतलब किसी 'shared_ptr' के स्वामित्व वाली किसी ऑब्जेक्ट के गैर-स्वामित्व वाले दृश्य के लिए है। यदि आप किसी भी तरह से 'कमजोर_प्टर' में पॉइंटर को सामान देने में सक्षम थे, तो यह पता नहीं होगा कि पॉइंटर समाप्त हो गया है या नहीं, और यह मुझे 'm_bar.lock हटाएं) को हटाने से रोकता है। (प्राप्त करें); अपनी कक्षा के भीतर। आप 100% बेवकूफ सबूत कभी नहीं बना सकते हैं। – Praetorian

उत्तर

10

आप ऐसा नहीं कर सकते हैं, आप केवल share_ptr या किसी अन्य weak_ptr से कमजोर_पीआरआर बना सकते हैं। तो विचार यह होगा कि पॉइंटर के मालिक कच्चे सूचक के बजाय एक साझा_ptr धारण करते हैं, और सब कुछ ठीक होना चाहिए।

1

कच्चे सूचक के बजाय साझा पॉइंटर पास करें, और उस साझा पॉइंटर से अपना कमजोर पॉइंटर बनाएं। यह वास्तव में एकमात्र तरीका है यदि सूचक का मालिक कक्षा के बाहर है।

4

कमजोर सूचक का उद्देश्य कच्चे सूचक का उपयोग करने में असमर्थ होना चाहिए यदि इसे हटा दिया गया हो। हालांकि, अगर आपके पास कच्चा सूचक है, तो कमजोर पॉइंटर को यह जानने का कोई तरीका नहीं है कि इसे हटा दिया गया था। इसके बजाए, आपके पास कहीं भी साझा_प्टर होना चाहिए जो कच्चे सूचक का "मालिक" है। फिर आप एक weak_ptr बना सकते हैं जो shared_ptr का संदर्भ देता है।

जब साझा_प्टर गुंजाइश से बाहर हो जाता है और अंतिम "मजबूत" स्मार्ट सूचक है, तो यह स्वचालित रूप से कच्चे सूचक को हटा देगा। फिर, जब आप weak_ptr को लॉक करने का प्रयास करते हैं, तो यह देखेंगे कि कोई "मजबूत" सूचक शेष नहीं है और इसलिए वस्तु मौजूद नहीं है।

2

आप जो कुछ भी कहा है पूरी तरह से उचित लगता है, एक बात को छोड़कर:

void setBar(const Bar *bar) 

यह एक कच्चे सूचक नहीं लेना चाहिए। यदि आपके पास कुछ आकर्षक तर्क है तो इसे weak_ptr आदर्श रूप से, या संभवतः shared_ptr लेना चाहिए।

प्रश्न में ऑब्जेक्ट के वास्तविक मालिक को weak_ptr बनाना चाहिए और इसके साथ setBar पर कॉल करना चाहिए। यह स्वामित्व semantics संरक्षित करता है। ऐसा लगता है कि आप क्या कर रहे हैं, स्वामित्व वाली वस्तु एक कच्चा सूचक लेती है और setBar पर जाती है। यह वस्तु के स्वामित्व में एक अर्थपूर्ण अंतर बनाता है।

5

यह करने के लिए एक ही रास्ता एक shared_ptr या weak_ptr कि सूचक मालिक को पकड़ रही है, अन्यथा weak_ptr इसके साथ स्वामित्व साझा करने के लिए मौजूदा मालिक को खोजने के लिए कोई तरीका नहीं है कर रहा है।

एक कच्चे सूचक है कि पहले से ही एक और shared_ptr के स्वामित्व में है से एक shared_ptr प्राप्त करने के लिए एक ही रास्ता है, तो Barenable_shared_from_this<Bar> से निकला है, तो आप

m_bar = bar->shared_from_this(); 
संबंधित मुद्दे