ในปัญหานี้ เราจะมาดูกันว่าเราจะสร้างคลาสได้อย่างไร โดยที่เราสามารถสร้างอ็อบเจ็กต์ผ่านการจัดสรรหน่วยความจำแบบไดนามิกเท่านั้น ไม่อนุญาตให้สร้างอ็อบเจ็กต์โดยตรง
ความคิดนั้นง่าย เราต้องสร้าง destructor ส่วนตัวสำหรับคลาสนั้น เมื่อ destructor เป็นส่วนตัว คอมไพเลอร์จะสร้างข้อผิดพลาดของคอมไพเลอร์สำหรับอ็อบเจ็กต์ที่ไม่ได้จัดสรรแบบไดนามิก เนื่องจากคอมไพเลอร์จำเป็นต้องลบออกจากสแต็กเซ็กเมนต์เมื่อไม่พร้อมใช้งาน สำหรับอ็อบเจ็กต์ที่จัดสรรแบบไดนามิก โปรแกรมเมอร์มีหน้าที่ลบอ็อบเจ็กต์ แต่คอมไพเลอร์จะไม่รับผิดชอบสำหรับสิ่งนั้น ดังนั้นจึงอนุญาตให้สร้างอ็อบเจ็กต์แบบไดนามิก
เพื่อหลีกเลี่ยงการรั่วไหลของหน่วยความจำ เราจะใช้ฟังก์ชันเพื่อนที่ผู้ใช้คลาสสามารถเรียกเพื่อทำลายวัตถุได้
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include<iostream> using namespace std; class NoDirectObjClass { private: ~NoDirectObjClass() { cout << "Destroyng NoDirectObjClass object" << endl; } public: NoDirectObjClass() { cout << "Creating object" << endl; } friend void friend_destructor(NoDirectObjClass* ); }; void friend_destructor(NoDirectObjClass* p) { delete p; cout << "Destroyng object using friend" << endl; } int main(){ NoDirectObjClass *p = new NoDirectObjClass; friend_destructor(p); }
ผลลัพธ์
Creating object Destroyng NoDirectObjClass object Destroyng object using friend
หากเราพยายามสร้างวัตถุโดยตรงโดยไม่ใช้การจัดสรรหน่วยความจำแบบไดนามิก มันจะสร้างผลลัพธ์ดังนี้ -
ตัวอย่าง (C++)
#include<iostream> using namespace std; class NoDirectObjClass { private: ~NoDirectObjClass() { cout << "Destroyng NoDirectObjClass object" << endl; } public: NoDirectObjClass() { cout << "Creating object" << endl; } friend void friend_destructor(NoDirectObjClass* ); }; void friend_destructor(NoDirectObjClass* p) { delete p; cout << "Destroyng object using friend" << endl; } int main(){ NoDirectObjClass t1; }
ผลลัพธ์
main.cpp: In function ‘int main()’: main.cpp:22:22: error: ‘NoDirectObjClass::~NoDirectObjClass()’ is private within this context NoDirectObjClass t1; ^~ main.cpp:6:9: note: declared private here ~NoDirectObjClass() { ^