2013-04-17 6 views
37

सामान्य स्थिति को देखते हुए जहां एक स्वामित्व वाली वस्तु का जीवन अपने मालिक से जुड़ा हुआ है, मैं एक अद्वितीय सूचक का उपयोग 2 तरीकों में से एक कर सकता हूं। ।क्या मुझे एक unique_ptr असाइन या रीसेट करना चाहिए?

यह सौंपा जा सकता है:

class owner 
{ 
    std::unique_ptr<someObject> owned;  
public: 
    owner() 
    { 
     owned=std::unique_ptr<someObject>(new someObject());   
    } 
}; 

रीसेट करने की विधि का उपयोग किया जा सकता है:

class owner 
{ 
    std::unique_ptr<someObject> owned;  
public: 
    owner() 
    { 
     owned.reset(new someObject()); 
    } 
}; 

सबसे अच्छा अभ्यास के हितों में, मैं एक दूसरे के ऊपर प्रपत्र को प्राथमिकता देनी चाहिए?

संपादित करें: क्षमा करें दोस्तों। मैंने इसे सरल बना दिया। ढेर आवंटन प्रारंभिक विधि में होता है, न कि सीटीआर में। इसलिए, मैं प्रारंभिक सूची का उपयोग नहीं कर सकता।

owner() : owned(new someObject()) 
{} 

अलावा कि मैं reset पसंद करते हैं आप एक बेकार मध्यवर्ती नहीं बनाते:

उत्तर

27

the docs of unique_ptr's operator= से:

स्थानांतरण वस्तु का स्वामित्व r द्वारा की ओर इशारा करने के लिए * इस रूप में अगर reset(r.release())std::forward<E>(r.get_deleter()) से एक काम के बाद फोन करके।

और यह सब आप इस बात का जरूरत reset कॉल है, इसलिए इसे 'के रूप में आप एक बेकार मध्यवर्ती उदाहरण का निर्माण नहीं करतीं मैं रीसेट पसंद करते हैं "आसान है बस इसे कॉल करने के लिए सीधे

+26

मुझे पता है कि यह देर हो चुकी है, लेकिन सिर्फ भविष्य के पाठकों के लिए। स्कॉट मेयर्स के अनुसार उनकी पुस्तक इफेक्टिव मॉडर्न सी ++ में, std :: make_unique बेहतर है, क्योंकि यह अपवाद सुरक्षा प्रदान करता है: मालिक = std :: make_unique ()। समस्या यह है कि std :: make_unique सी ++ 14 (सी ++ 11 नहीं) का हिस्सा है, लेकिन यहां आप [यहां] (https://isocpp.org/files/papers/N3656.txt) ढूंढ सकते हैं अच्छा कार्यान्वयन कि आप कॉपी-पेस्ट कर सकते हैं। –

15

(जिसे आप सूची नहीं था) यह करने के लिए उचित तरीके से owned के निर्माता का उपयोग करने के लिए है उस मामले में उदाहरण (भले ही मशीन स्तर पर कोई फर्क नहीं पड़ता क्योंकि अनुकूलक वहां बहुत कुछ कर सकता है)।

+1

- यह है कि यह हो जाता है। धन्यवाद – learnvst

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