स्कॉट मायर्स ने लिखा है, आप क्लोन() को वास्तविक प्रकार के घोषित करने के लिए क्लोन() घोषित करने के लिए सी ++ के प्रकार-सिस्टम में छूट का लाभ उठा सकते हैं:सी ++ में क्लोन() के लिए सबसे अच्छा हस्ताक्षर क्या है?
class Base
{
virtual Base* clone() const = 0;
};
class Derived : public Base
{
virtual Derived* clone() const
};
संकलक यह पता लगाता है कि क्लोन() एक क्लोन() देता है ऑब्जेक्ट के प्रकार के लिए पॉइंटर, और व्युत्पन्न करने के लिए एक पॉइंटर वापस करने के लिए व्युत्पन्न करने के लिए व्युत्पन्न की अनुमति देता है।
क्लोन() एक स्मार्ट पॉइंटर लौटने के लिए वांछनीय होगा जो स्वामित्व अर्थशास्त्र का हस्तांतरण निम्नानुसार करता है:
class Base
{
virtual std::auto_ptr<Base> clone() const = 0;
};
class Derived : public Base
{
virtual std::auto_ptr<Derived> clone() const;
};
दुर्भाग्यवश, सम्मेलनों की छूट टेम्पलेट स्मार्ट पॉइंटर्स पर लागू नहीं होती है, और कंपाइलर ओवरराइड की अनुमति नहीं देगा।
तो, ऐसा लगता है कि मुझे दो विकल्पों के साथ छोड़ा गया है:
- क्लोन() एक "गूंगा" पॉइंटर लौटाएं, और दस्तावेज़ जो ग्राहक इसका निपटान करने के लिए ज़िम्मेदार हैं।
- क्लोन() एक स्मार्ट बेस पॉइंटर लौटाएं, और क्लाइंट्स को गतिशील पॉइंटर पर सहेजने के लिए डायनामिक_कास्ट का उपयोग करें यदि उन्हें इसकी आवश्यकता हो।
इन दृष्टिकोणों में से एक पसंदीदा है? या क्या मेरे पास स्वामित्व अर्थशास्त्र के हस्तांतरण को खाने का कोई तरीका है और मेरी मजबूत प्रकार की सुरक्षा भी है?
वास्तव में, यह मैं क्या मतलब शुरू हो रहा है - मैं सीधे नए कह सकते हैं कॉपी निर्माता के साथ जब मुझे उस विशेष कक्षा की आवश्यकता थी। – JohnMcG