将析构函数设为私有有什么用?
当前回答
这可能是在Windows中处理问题的一种方法,其中每个模块可以使用不同的堆,例如Debug堆。如果这个问题处理不当,就会发生不好的事情。
其他回答
Dirkgently错了。下面是一个在堆栈上创建了私有c-tor和d-tor的对象的例子(我在这里使用静态成员函数,但它也可以用friend函数或friend类来完成)。
#include <iostream>
class PrivateCD
{
private:
PrivateCD(int i) : _i(i) {};
~PrivateCD(){};
int _i;
public:
static void TryMe(int i)
{
PrivateCD p(i);
cout << "inside PrivateCD::TryMe, p._i = " << p._i << endl;
};
};
int main()
{
PrivateCD::TryMe(8);
};
这段代码将产生输出: 在PrivateCD::TryMe, p._i = 8
基本上,任何时候你想让其他类负责你类对象的生命周期,或者你有理由阻止对象的销毁,你都可以将析构函数设为private。
例如,如果您正在做一些引用计数的事情,您可以让对象(或已被“好友”化的管理器)负责计算对自己的引用数量,并在数量为零时删除它。私有dtor可以防止其他人在仍然有引用的情况下删除它。
另一个例子是,如果你有一个对象,它有一个管理器(或它本身),可以根据程序中的其他条件(比如正在打开的数据库连接或正在写入的文件)销毁它或拒绝销毁它。您可以在类或管理器中有一个“request_delete”方法,它将检查该条件,它将删除或拒绝,并返回一个状态,告诉您它做了什么。这比调用delete要灵活得多。
再加上这里已经给出的答案;私有构造函数和析构函数在实现需要将创建的对象分配到堆上的工厂时非常有用。对象通常由静态成员或友元创建/删除。一个典型用法的例子:
class myclass
{
public:
static myclass* create(/* args */) // Factory
{
return new myclass(/* args */);
}
static void destroy(myclass* ptr)
{
delete ptr;
}
private:
myclass(/* args */) { ... } // Private CTOR and DTOR
~myclass() { ... } //
}
int main ()
{
myclass m; // error: ctor and dtor are private
myclass* mp = new myclass (..); // error: private ctor
myclass* mp = myclass::create(..); // OK
delete mp; // error: private dtor
myclass::destroy(mp); // OK
}
我知道你在问私有析构函数。下面是我如何使用受保护的。其思想是,您不想通过向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(){}
};
当您不希望用户访问析构函数时,也就是说,您希望只通过其他方式销毁对象。
http://blogs.msdn.com/larryosterman/archive/2005/07/01/434684.aspx给出了一个例子,其中对象被引用计数,并且只有当计数为零时才会被对象本身销毁。
推荐文章
- 什么是“参数依赖查找”(又名ADL,或“Koenig查找”)?
- 公共朋友交换成员函数
- 如何在Go中使用c++
- 自定义c++分配器的引人注目的例子?
- RAII和c++中的智能指针
- 如何构建和使用谷歌TensorFlow c++ api
- 断言是邪恶的吗?
- 下面这些短语在c++中是什么意思:0 -,default-和value-initialization?
- 在STL地图中,使用map::insert比[]更好吗?
- C++ Linux的想法?
- 如何为Fedora安装g++ ?
- Std::cin输入空格?
- c++标准是否要求iostreams的性能很差,或者我只是在处理一个糟糕的实现?
- gcc在哪里查找C和c++头文件?
- 为什么我们需要require require ?