ในปัญหานี้ เราจะมาดูกันว่าเราจะสร้างคลาสได้อย่างไร โดยที่เราสามารถสร้างอ็อบเจ็กต์ผ่านการจัดสรรหน่วยความจำแบบไดนามิกเท่านั้น ไม่อนุญาตให้สร้างอ็อบเจ็กต์โดยตรง
ความคิดนั้นง่าย เราต้องสร้าง 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() {
^