Ctor और असाइनमेंट को निजी बनाकर (या उन्हें C ++ 11 में हटाकर) घोषित करके आप कॉपी को निष्क्रिय कर देते हैं।
यहाँ मुद्दा यह है कि आपको क्या करना है। अपने कोड के साथ रहने के लिए, IAbstract कोई समस्या नहीं है। (ध्यान दें कि आपने क्या किया था, आप *a1
IAbstract
सबबॉजेक्ट को a2 में असाइन करते हैं , किसी भी संदर्भ को खो देते हैं Derived
। मान असाइनमेंट पॉलिमॉर्फिक नहीं है)
मुद्दे के साथ आता है Derived::theproblem
। वास्तव में एक व्युत्पन्न को कॉपी करना *theproblem
डेटा को साझा कर सकता है जिसे साझा करने के लिए डिज़ाइन नहीं किया जा सकता है (दो उदाहरण हैं जो delete theproblem
उनके विनाशकर्ता में कॉल कर सकते हैं )।
अगर ऐसा है, तो यह है Derived
कि गैर-प्रतिलिपि योग्य होना चाहिए और असाइन करने योग्य नहीं होना चाहिए। बेशक, अगर आप निजी कॉपी को अंदर IAbstract
से कॉपी करते Derived
हैं, तो Derived
इसकी जरूरत के लिए डिफ़ॉल्ट कॉपी भी कॉपी नहीं होगी। लेकिन अगर आप अपने खुद Derived::Derived(const Derived&)
के फोन को IAbtract
कॉपी के बिना परिभाषित करते हैं , तो आप उन्हें कॉपी कर सकते हैं।
समस्या व्युत्पन्न में है, और समाधान को व्युत्पन्न में रहना चाहिए: यदि यह केवल बिंदुओं या संदर्भों द्वारा पहुँचा गया एक गतिशील-एकमात्र ऑब्जेक्ट होना चाहिए, तो यह व्युत्पन्न ही है जो होना चाहिए
class Derived
{
...
Derived(const Derived&) = delete;
Derived& operator=(const Derived&) = delete;
};
अनिवार्य रूप से यह व्युत्पन्न वर्ग के डिजाइनर पर निर्भर है (यह जानना चाहिए कि व्युत्पन्न कैसे काम करता है और कैसे theproblem
प्रबंधित किया जाता है) यह तय करने के लिए कि असाइनमेंट और कॉपी के साथ क्या करना है।