आप निश्चित रूप से अपनी व्युत्पन्न कक्षा में एक कॉपी कन्स्ट्रक्टर और एक कॉपी असाइनमेंट ऑपरेटर दोनों को लागू कर सकते हैं, लेकिन यह संभवतः खराब डिज़ाइन का संकेत है। इस उदाहरण को लें:
#include <iostream>
class Base {
public:
Base() {}
private:
Base(const Base& other) {
std::cout << "Base copy constructor invoked!" << std::endl;
}
};
class Derived : public Base {
public:
Derived() {}
Derived(const Derived& other) {
std::cout << "Derived copy constructor invoked!" << std::endl;
}
};
int main(int argc, char** argv) {
Derived a;
Derived b = a;
return 0;
}
यह ठीक ठीक संकलित करेगा। हालांकि, जैसा कि अपेक्षित है, जब आप परिणामस्वरूप प्रोग्राम चलाते हैं, तो मुद्रित सभी Derived copy constructor invoked!
है। जब बेस क्लास अपनी कॉपी कन्स्ट्रक्टर/कॉपी असाइनमेंट ऑपरेटर को निजी के रूप में घोषित करता है, जो व्युत्पन्न कक्षाओं को अपने संस्करणों को लागू करने से नहीं रोकता है। यह बस व्युत्पन्न कक्षाओं को बेस क्लास संस्करण पर कॉल करने से रोकता है।
और इसमें समस्या है: यह सुनिश्चित करने के लिए हमेशा अच्छा अभ्यास होता है कि आप किसी ऑब्जेक्ट के सभी हिस्सों की प्रतिलिपि बनाते हैं, ताकि आपके पास वास्तव में दो अलग-अलग प्रतियां हों। आपकी ऑब्जेक्ट का हिस्सा बेस क्लास के स्वामित्व वाले डेटा में शामिल है, इसलिए आपको यह सुनिश्चित करना होगा कि पूर्ण प्रतिलिपि बनाई गई हो, यह सुनिश्चित करने के लिए आपको बेस क्लास की कॉपी कन्स्ट्रक्टर/कॉपी असाइनमेंट ऑपरेटर का आह्वान करना चाहिए। लेकिन वह डेटा गैर-प्रतिलिपि डिजाइन द्वारा है। इस प्रकार, वस्तु के सभी भागों की प्रतिलिपि बनाना असंभव है।
यदि आप इस डिज़ाइन के साथ रहना चाहते हैं तो यह आपके ऊपर निर्भर करता है। खुद से पूछने के लिए एक महत्वपूर्ण बात यह है कि क्या आपकी व्युत्पन्न कक्षा को वास्तव में प्रतिलिपि बनाने की आवश्यकता है? यदि नहीं, तो चिंता करने की कोई बात नहीं है!
आपका मतलब है कि 'QObject' का उपयोग नहीं करता है। क्योंकि प्रतिबिंब इस मुद्दे का स्रोत नहीं है। मुद्दा यह है कि QObject प्रतिलिपि बनाते हैं और असाइनमेंट निजी (एक अच्छे कारण के लिए)। –
@ क्रिस्टियनप, अच्छा सुझाव, मैं इसे संपादित कर दूंगा * if * @alexisdm ने मेरे सटीक प्रश्न का सही उत्तर नहीं दिया। अक्सर बार जवाब होता है कि "जो भी आप करने के लिए कह रहे हैं वह मत करो" लेकिन इस मामले में, भले ही यह एक उचित उत्तर है, वही भी है जो मुझे ऐसा करने देता है जो मैं करना चाहता हूं: 'Q_GADGET' –