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