ที่นี่เราจะดูเมื่อไหร่ต้องสร้าง assignment operator เองใน C++ หากคลาสไม่มี pointer ใดๆ เราไม่ต้องสร้าง assignment operator และ copy constructor คอมไพเลอร์ C++ จะสร้าง copy constructor และ assignment operator ให้อัตโนมัติสำหรับทุกคลาส หาก operator เหล่านั้นไม่เพียงพอ เราจึงต้องสร้างเอง
ตัวอย่างปัญหา
#include <iostream>
using namespace std;
class MyClass {
int *ptr;
public:
MyClass(int x = 0) {
ptr = new int(x);
}
void setValue(int x) {
*ptr = x;
}
void print() {
cout << *ptr << endl;
}
};
int main() {
MyClass ob1(50);
MyClass ob2;
ob2 = ob1;
ob1.setValue(100);
ob2.print();
}
ผลลัพธ์
100
ใน main() เราตั้งค่า x ผ่าน setValue() ให้ ob1 ค่าก็เปลี่ยนใน ob2 ด้วย เพราะไม่มี assignment operator ผู้ใช้ คอมไพเลอร์สร้างให้เอง โดยคัดลอก ptr จาก RHS ไป LHS ทำให้ทั้งสองชี้ไปที่เดียวกัน
แก้ไขได้ 2 วิธี: 1) สร้าง dummy private assignment operator ป้องกันการคัดลอก 2) สร้าง assignment operator เอง
ตัวอย่างแก้ไข
#include <iostream>
using namespace std;
class MyClass {
int *ptr;
public:
MyClass(int x = 0) {
ptr = new int(x);
}
void setValue(int x) { *ptr = x; }
void print() { cout << *ptr << endl; }
// Assignment operator เอง
MyClass& operator=(const MyClass& ob2) {
// ตรวจสอบ self-assignment
if (this != &ob2)
*ptr = *(ob2.ptr);
return *this;
}
};
int main() {
MyClass ob1(50);
MyClass ob2;
ob2 = ob1;
ob1.setValue(100);
ob2.print();
}
ผลลัพธ์
50
ที่นี่ assignment operator ทำ deep copy และเก็บ pointer แยกกัน ต้องระวัง self-reference ไม่เช่นนั้นอาจเปลี่ยนค่าของออบเจ็กต์ปัจจุบัน