如何建立一個只有其物件可以透過動態記憶體分配來分配的 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 *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() {
         ^

更新時間:2020 年 8 月 27 日

285 次瀏覽

開啟你的職業生涯

完成課程,獲得認證

立即開始
廣告
© . All rights reserved.