เราสามารถบังคับให้ class ไม่อนุญาตให้สร้าง object บน stack (automatic storage) ได้ โดยทำให้ destructor เป็น private คอมไพเลอร์จะ error ตอนพยายามทำลาย object บน stack เพราะต้องเรียก destructor แต่เข้าถึงไม่ได้ สำหรับ dynamic allocation (new) โปรแกรมเมอร์ต้อง delete เอง คอมไพเลอร์จึงไม่บังคับเรียก destructor ให้
เทคนิค: Private Destructor + Friend Function
#include <iostream>
using namespace std;
class NoDirectObjClass {
private:
~NoDirectObjClass() {
cout << "Destroying NoDirectObjClass object" << endl;
}
public:
NoDirectObjClass() {
cout << "Creating object" << endl;
}
friend void friend_destructor(NoDirectObjClass* );
};
void friend_destructor(NoDirectObjClass* p) {
delete p;
cout << "Destroying object using friend" << endl;
}
int main() {
NoDirectObjClass *p = new NoDirectObjClass; // OK
friend_destructor(p); // ใช้ friend function ลบ
}
เอาต์พุท
Creating object Destroying NoDirectObjClass object Destroying object using friend
ถ้าพยายามสร้างบน Stack (Direct)
int main() {
NoDirectObjClass t1; // Compile Error!
}
Error
error: 'NoDirectObjClass::~NoDirectObjClass()' is private within this context
ข้อควรระวัง
- ต้องมี friend function (หรือ public static method) เพื่อลบ object ไม่งั้นจะ memory leak
- Copy constructor/assignment ควรเป็น private/delete ด้วย เพื่อป้องกัน copying
- Pattern นี้ใช้ได้กับ Singleton, Object Pool, หรือ Resource Management