如何创建一个只有其对象可以通过动态内存分配来分配的 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 次浏览

开启你的职业生涯

完成课程,获得认证

立即开始
广告