std::unique_ptr
किसी हटाए प्रतिलिपि निर्माता, जिसका मतलब है कि अगर आप एक डेटा सदस्य के रूप में अपनी कक्षा Foo
में एक unique_ptr
है तो आप Foo
और मैन्युअल रूप से गहरे प्रतिलिपि के लिए अपनी प्रति निर्माता लिखना चाहिए है कि सदस्य (भले ही कंपाइलर से उत्पन्न प्रतिलिपि निर्माता अन्य सभी सदस्यों के लिए ठीक होगा)।ऑटो क्लोनिंग unique_ptr
पॉलिमॉर्फिक तरीके से कॉपी करने में सक्षम होने के लिए, clone()
विधि पैटर्न का उपयोग किया जा सकता है।
class Base {
virtual std::unique_ptr<Base> clone() = 0;
};
फू इस तरह दिखता है अब: चलो हमारे वस्तुओं इस तरह एक क्लोन विधि है मान लेते हैं
class Foo {
public:
...
Foo(Foo const& other)
: b(other.b->clone())
, // init 10 more members that could otherwise be auto-copied just fine
// with the automatically generated copy constructor
{}
...
private:
std::unique_ptr<Base> b;
//10 more data members
};
अब, मैं ऑटो क्लोन Foo::b
करने के लिए एक रास्ता मिल गया, unique_ptr
पर एक आवरण लिख कर कि clone
पर कॉल करके कॉपी कन्स्ट्रक्टर और असाइनमेंट को परिभाषित करता है।
template <typename T>
class auto_cloned_unique_ptr
{
private:
std::unique_ptr<T> up;
public:
// copy constructor
auto_cloned_unique_ptr(auto_cloned_unique_ptr<T> const& other)
: up(other.up->clone()) {}
// copy assignment
auto_cloned_unique_ptr<T>& operator =(auto_cloned_unique_ptr<T> const& other)
{
this->up = other.up->clone();
return *this;
}
auto_cloned_unique_ptr(std::unique_ptr<T> _up)
: up(std::move(_up)) {}
// Delegate everything else to unique_ptr
auto_cloned_unique_ptr(auto_cloned_unique_ptr<T>&& other)
: up(std::move(other.up)) {}
auto_cloned_unique_ptr<T>& operator =(auto_cloned_unique_ptr<T>&& other)
{
this->up = std::move(other.up);
return *this;
}
auto operator *() const {return *up;}
auto operator->() const {return up.operator->();}
auto get() -> const {return up.get();}
};
अब अगर हम इस का उपयोग हम अपने खुद के प्रति निर्माता परिभाषित करने की जरूरत नहीं है:
class Foo2 {
public:
...
private:
auto_cloned_unique_ptr<Base> b;
//10 more data members
};
(unique_ptr
पर एक गैर मानक आवरण का उपयोग कर के लिए) इस तरह के दृष्टिकोण बहुत ज्यादा पर सिकोड़ी है ?
ऐसे कई प्रस्ताव हुए हैं। 'Value_ptr' के लिए खोजें, बस एक नाम देने के लिए। आम तौर पर, यह गारंटी देना मुश्किल है कि इसका उपयोग सही ढंग से किया जाता है, और इसलिए मानक में शामिल होने का अधिकार नहीं है। –
वैसे, 'unique_ptr' से 'निजी' का उत्तराधिकारी क्यों नहीं है और कन्स्ट्रक्टर विरासत का उपयोग क्यों करें? – Columbo
* "क्या इस तरह का दृष्टिकोण बहुत अधिक फहरा हुआ है" * एक प्रश्न है जो [कोड समीक्षा] (http://codereview.stackexchange.com) आईएमओ पर बेहतर फिट बैठता है। – dyp