如何创建一个只有其对象可以通过动态内存分配来分配的 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() { ^
广告