Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में ऑब्जेक्ट कॉपी को रोकना


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 सिंटैक्स अधिक स्पष्ट है, बेहतर एरर मैसेज देता है, और मूव सेमेन्टिक्स को सक्षम करने की अनुमति देता है यदि वांछित हो।

  1. - C++ में कॉन्स्ट सदस्य फ़ंक्शंस (Const Member Functions)

    कॉन्स्ट सदस्य फ़ंक्शन क्या है? प्रोग्राम में कॉन्स्ट के रूप में घोषित फ़ंक्शन। इन फ़ंक्शंस द्वारा कॉल किया गया ऑब्जेक्ट मॉडिफाई नहीं किया जा सकता। आकस्मिक परिवर्तनों से बचने के लिए const कीवर्ड का उपयोग करने की सिफारिश की जाती है। नियम कॉन्स्ट सदस्य फ़ंक्शन किसी भी प्रकार के ऑब्जेक्ट (कॉन्स्ट या

  1. - C++ में स्ट्रिंग कॉपी करने का प्रोग्राम

    एक स्ट्रिंग एक एक-आयामी कैरेक्टर सरणी है जो नल कैरेक्टर द्वारा समाप्त होती है। एक स्ट्रिंग का मान दूसरी स्ट्रिंग में कॉपी किया जा सकता है। यह या तो strcpy() फ़ंक्शन का उपयोग करके किया जा सकता है जो एक मानक लाइब्रेरी फ़ंक्शन है या इसके बिना। strcpy() फ़ंक्शन का उपयोग किए बिना स्ट्रिंग कॉपी करने का प्

  1. - C++ में Python ऑब्जेक्ट का उपयोग कैसे करें?

    यहां एक उदाहरण है जिसमें एक साधारण Python ऑब्जेक्ट को रैप और एम्बेड किया गया है। हम इसके लिए .c का उपयोग कर रहे हैं, C++ के चरण समान हैं: class PyClass(object): def __init__(self): self.data = [] def add(self, val): self.data.append(val) def __str__(self): return