Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

วิธีสร้างคลาส C ++ ที่มีวัตถุที่สามารถจัดสรรแบบไดนามิกเท่านั้น?


ในปัญหานี้ เราจะมาดูกันว่าเราจะสร้างคลาสได้อย่างไร โดยที่เราสามารถสร้างอ็อบเจ็กต์ผ่านการจัดสรรหน่วยความจำแบบไดนามิกเท่านั้น ไม่อนุญาตให้สร้างอ็อบเจ็กต์โดยตรง

ความคิดนั้นง่าย เราต้องสร้าง 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() {
         ^