将析构函数设为私有有什么用?
当前回答
该类只能被自身删除。在创建引用计数对象时很有用。然后只有release方法可以删除对象,这可能会帮助您避免错误。
其他回答
这样的对象永远不能在堆栈上创建。总是在堆上。删除必须通过朋友或会员来完成。一个产品可以使用一个Object层次结构和一个自定义内存管理器——这样的场景可以使用一个私有的dtor。
#include <iostream>
class a {
~a() {}
friend void delete_a(a* p);
};
void delete_a(a* p) {
delete p;
}
int main()
{
a *p = new a;
delete_a(p);
return 0;
}
COM使用此策略删除实例。COM使析构函数私有,并提供删除实例的接口。
下面是一个Release方法的示例。
int MyRefCountedObject::Release()
{
_refCount--;
if ( 0 == _refCount )
{
delete this;
return 0;
}
return _refCount;
}
ATL COM对象就是这种模式的一个主要例子。
该类只能被自身删除。在创建引用计数对象时很有用。然后只有release方法可以删除对象,这可能会帮助您避免错误。
当您不希望用户访问析构函数时,也就是说,您希望只通过其他方式销毁对象。
http://blogs.msdn.com/larryosterman/archive/2005/07/01/434684.aspx给出了一个例子,其中对象被引用计数,并且只有当计数为零时才会被对象本身销毁。
我知道你在问私有析构函数。下面是我如何使用受保护的。其思想是,您不想通过向main类添加额外功能的类的指针来删除main类。 在下面的例子中,我不希望通过HandlerHolder指针删除GuiWindow。
class Handler
{
public:
virtual void onClose() = 0;
protected:
virtual ~Handler();
};
class HandlerHolder
{
public:
void setHandler( Handler* );
Handler* getHandler() const;
protected:
~HandlerHolder(){}
private:
Handler* handler_;
};
class GuiWindow : public HandlerHolder
{
public:
void finish()
{
getHandler()->onClose();
}
virtual ~GuiWindow(){}
};