Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

การป้องกันการคัดลอกออบเจ็กต์ใน C++


การป้องกันการคัดลอกออบเจ็กต์ใน C++

ใน C++ เมื่อสร้างคลาสขึ้น เราสามารถคัดลอกได้โดยใช้คอนสตรัคเตอร์คัดลอก (copy constructor) หรือออเปอเรเตอร์กำหนดค่า (assignment operator) ในส่วนนี้เราจะดูวิธีป้องกันการคัดลอกออบเจ็กต์ของคลาสใน C++ โดยทำตามกฎดังต่อไปนี้

1. สร้างคอนสตรัคเตอร์คัดลอกและออเปอเรเตอร์กำหนดค่าเป็น private

ตัวอย่าง

#include <iostream>
using namespace std;

class MyClass {
    int x;
public:
    MyClass() {
        // คอนสตรัคเตอร์ไม่มีพารามิเตอร์
    }
    MyClass(int y) : x(y) {
    }
private:
    MyClass(const MyClass& obj) : x(obj.x) {
        // คอนสตรัคเตอร์คัดลอกแบบ private
    }
    MyClass& operator=(const MyClass& tmp_obj) {
        // ออเปอเรเตอร์กำหนดค่าที่ overload แบบ private
        x = tmp_obj.x;
        return *this;
    }
};

int main() {
    MyClass ob(50);
    MyClass ob2(ob); // เรียกคอนสตรัคเตอร์คัดลอก
    ob2 = ob; // เรียกออเปอเรเตอร์กำหนดค่าคัดลอก
}

ผลลัพธ์

[Error] 'MyClass::MyClass(const MyClass&)' is private
[Error] within this context
[Error] 'MyClass& MyClass::operator=(const MyClass&)' is private
[Error] within this context

2. สืบทอดจากคลาสดั๊มมี่ที่มีคอนสตรัคเตอร์คัดลอกและออเปอเรเตอร์กำหนดค่าเป็น private

ตัวอย่าง

#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; // เรียกออเปอเรเตอร์กำหนดค่าคัดลอก
}

ผลลัพธ์

[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
In function 'int main()':
[Note] synthesized method 'MyClass& MyClass::operator=(const MyClass&)' first required here