2016-09-27 10 views
12

द्वारा पैरामीटर का स्वामित्व लें, मैं यह स्पष्ट करना चाहता हूं कि मेरी कक्षा A का निर्माता Data पैरामीटर का स्वामित्व लेगा।रैवल्यू-रेफरेंस

class A 
{ 
public: 
    A(std::unique_ptr<Data> data) : _data(std::move(data)) { } 

    std::unique_ptr<Data> _data; 
}; 

लेकिन, मेरा यूज-केस के लिए, वहाँ कोई कारण नहीं क्यों Data एक सूचक होना चाहिए, के बाद से एक मान प्रकार पर्याप्त होगा है: करने के लिए स्पष्ट बात मान द्वारा एक unique_ptr लेते हैं।

class A 
{ 
public: 
    A(Data&& data) : _data(std::move(data)) { } 

    Data _data; 
}; 

है इस स्वामित्व संकेत या वहाँ बेहतर विकल्प यह करने के लिए कर रहे हैं के लिए एक वैध तरीका: एकमात्र शेष विकल्प है कि मैं के बारे में सोच सकता है वास्तव में स्पष्ट है कि DataA के स्वामित्व में किया जाएगा बनाने के लिए rvalue-संदर्भ द्वारा पास होना जरूरी है unique_ptr का उपयोग किए बिना?

+0

सीटीओ स्वामित्व क्यों लेता है? –

+2

मैं कन्स्ट्रक्टर इंजेक्शन जैसे विविध कारणों के लिए कन्स्ट्रक्टर स्पष्ट –

+1

@IvanRubinson बनाउंगा। –

उत्तर

4

हाँ, मुझे लगता है कि यह एक वैध तरीका है।

unique_ptr के मामले में, यह गैर-प्रतिलिपि योग्य है, इसलिए किसी को गलती से प्रतिलिपि बनाने का कोई खतरा नहीं है जब वे पास-दर-मूल्य और पास-दर-रावल-संदर्भ संकेत दोनों का इरादा नहीं रखते थे स्वामित्व लेना

Data के मामले में, पास-बाय-रावल्यू-रेफरेंस दस्तावेज़ जो आप स्वामित्व ले रहे हैं और कॉलर का आकस्मिक रूप से प्रतिलिपि बनाने का कोई खतरा नहीं है जब उनका इरादा नहीं था।

2

हां, यह एक वैध तरीका है। आप इसे मूल्य से भी पास कर सकते हैं:

class A { 
    A(Data data) : _data(std::move(data)) { } 
}; 
Data data; 
A a(std::move(data)); 
+2

बेशक यह भी एक विकल्प है। हालांकि, यह वस्तु को स्थानांतरित करने के लिए लागू नहीं होता है और इसलिए अनावश्यक प्रतियां बनाई जा सकती हैं। –

+2

@angelag इस मामले में, मुझे लगता है कि पास-बाय-वैल्यू बेहतर विकल्प हो सकता है। यदि आप चाहते हैं कि 'डेटा' में हमेशा एक ही स्वामी हो, तो आपको इसे गैर-प्रतिलिपि बनाना चाहिए, और' अद्वितीय 'के साथ किए गए मूल्य कार्यों के द्वारा' डेटा' को पास करना चाहिए। अन्यथा, यानी 'डेटा' कॉपी करने योग्य है, पास-दर-मूल्य ग्राहक को दो विकल्प देता है: इसे कॉपी करें या इसे' स्थानांतरित करें '। यह अधिक लचीला है, और कभी-कभी ग्राहक 'ए' के निर्माता को पास करने के बाद 'डेटा' की एक प्रति रखना चाहता है। –