जाहिर है आप न सिर्फ std::unique_ptr
एस के एक काम के रूप में अपने असाइनमेंट ऑपरेटर हटा दी जाती है कर सकते हैं। यह प्रोग्रामर को अपने इच्छित व्यवहार को परिभाषित करने के लिए मजबूर करना है।
- नया आइटम मूल आइटम को अमान्य कर
c_
का स्वामित्व लेता है।
- नया आइटम मूल आइटम वैधता को बनाए रखने,
c_
की एक प्रति बनाता है।
- नया आइटम
c_
का स्वामित्व साझा करता है ताकि दोनों नए और मूल आइटम एक ही ऑब्जेक्ट को संदर्भित कर सकें।
में मामला 1 क्या आप देख रहे हैं एक कदम निर्माता है, और डिफ़ॉल्ट चाल निर्माता से कार्य करेंगे। तो अगर आप किसी भी कोड लिखने की जरूरत नहीं है, तो आप सिर्फ कर सकते हैं:
A temp;
A foo(std::move(temp));
ध्यान दें कि temp
के बाद यह ले जाया जाता है अमान्य है। A
में इस परिभाषित आप कर सकते हैं के बाद
A(const A& a):c_(new C(*(a.c_))){}
:
में मामला 2 आप मूल के c_
की एक प्रतिलिपि बनाने के लिए A
के लिए एक कस्टम प्रतिलिपि निर्माता जोड़ने की आवश्यकता होगी
A foo(A());
ध्यान दें कि यह C
की कॉपी कन्स्ट्रक्टर पर कार्यात्मक होने पर निर्भर करता है।
मामले 3 में आप मूलरूप से एक std::shared_ptr
उपयोग करने के लिए एक std::unique_ptr
का उपयोग करने से A
को बदलना होगा, तो c_
की परिभाषा बन गयी:
std::shared_ptr<C> c_;
c_
का आपका निर्माण के समान होगा c_
के std::unique_ptr
संस्करण के लिए आप पहले से ही क्या उपयोग कर रहे हैं। तो बस डिफ़ॉल्ट कार्यान्वयन का उपयोग कर आप कर सकता है:
A foo;
A bar(foo);
और अब foo
और एक ही C
वस्तु को bar
बिंदु है, और यह के स्वामित्व को साझा करें। यह साझा ऑब्जेक्ट तब तक नहीं हटाया जाएगा जब तक कि सभी shared_ptr
के संदर्भ में इसे हटा दिया गया हो।
स्रोत
2015-03-18 15:25:53
तो जब आप एक प्रतिलिपि बनाते हैं तो आप मूल अमान्य बनाना चाहते हैं? मैं कॉपी कन्स्ट्रक्टर को हटाने और कक्षा को केवल चलने योग्य बनाने का सुझाव दूंगा। – NathanOliver
यदि मूल के साथ आप मूल वस्तु का मतलब है हां यह कक्षा बी के सदस्य के रूप में "हस्तांतरण" होना चाहिए। क्या आप इसका उदाहरण प्रदान कर सकते हैं? – gcswoosh
@ गैब्रिलेक्सवोश [टैग: मूव-सेमेन्टिक्स] टैग पर प्रश्न/उत्तर पढ़ने में कुछ समय बिताएं। –