C++ में, जब क्लासेस बनाई जाती हैं, तो हम उन्हें कॉपी कंस्ट्रक्टर या असाइनमेंट ऑपरेटर का उपयोग करके कॉपी कर सकते हैं। इस सेक्शन में हम देखेंगे कि C++ में किसी क्लास के ऑब्जेक्ट कॉपी को कैसे रोका जाए। ऑब्जेक्ट कॉपी को रोकने के लिए हम कुछ नियमों का पालन कर सकते हैं।
विधि 1: प्राइवेट कॉपी कंस्ट्रक्टर और प्राइवेट असाइनमेंट ऑपरेटर
#include <iostream>
using namespace std;
class MyClass {
int x;
public:
MyClass() { }
MyClass(int y) : x(y) { }
private:
MyClass(const MyClass& obj) : x(obj.x) { } // प्राइवेट कॉपी कंस्ट्रक्टर
MyClass& operator=(const MyClass& tmp_obj) { // प्राइवेट असाइनमेंट ऑपरेटर
x = tmp_obj.x;
return *this;
}
};
int main() {
MyClass ob(50);
MyClass ob2(ob); // कॉपी कंस्ट्रक्टर कॉल करता है - एरर
ob2 = ob; // कॉपी असाइनमेंट ऑपरेटर कॉल करता है - एरर
return 0;
}
आउटपुट
[Error] 'MyClass::MyClass(const MyClass&)' is private [Error] within this context [Error] 'MyClass& MyClass::operator=(const MyClass&)' is private [Error] within this context
विधि 2: डमी क्लास से इनहेरिट करें जिसमें प्राइवेट कॉपी कंस्ट्रक्टर और असाइनमेंट ऑपरेटर हो
#include <iostream>
using namespace std;
class DummyClass {
public:
DummyClass() { }
private:
DummyClass(const DummyClass& temp_obj) { }
DummyClass& operator=(const DummyClass& temp_obj) { }
};
class MyClass : public DummyClass {
int x;
public:
MyClass() { }
MyClass(int y) : x(y) { }
};
int main() {
MyClass ob1(50);
MyClass ob2(ob1); // कॉपी कंस्ट्रक्टर कॉल करता है - एरर
ob2 = ob1; // कॉपी असाइनमेंट ऑपरेटर कॉल करता है - एरर
return 0;
}
आउटपुट
[Error] 'DummyClass::DummyClass(const DummyClass&)' is private [Error] within this context In function 'int main()': [Note] synthesized method 'MyClass::MyClass(const MyClass&)' first required here In member function 'MyClass& MyClass::operator=(const MyClass&)': [Error] 'DummyClass& DummyClass::operator=(const DummyClass&)' is private [Error] within this context
आधुनिक C++ (C++11 और बाद) में बेहतर तरीका: = delete
class MyClass {
int x;
public:
MyClass() = default;
MyClass(int y) : x(y) { }
// कॉपी रोकें
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
// मूव सेमेन्टिक्स अनुमति दें (वैकल्पिक)
MyClass(MyClass&&) = default;
MyClass& operator=(MyClass&&) = default;
};
= delete सिंटैक्स अधिक स्पष्ट है, बेहतर एरर मैसेज देता है, और मूव सेमेन्टिक्स को सक्षम करने की अनुमति देता है यदि वांछित हो।