การป้องกันการคัดลอกออบเจ็กต์ใน 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