如何制作一个只能动态分配对象的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() {
         ^
猜你喜欢