我喜欢const成员变量的想法,尤其是当我将C函数包装到类中时。构造函数需要一个资源句柄(例如文件描述符),该句柄在整个对象生命周期内保持有效,并且析构函数最终关闭它。 (这是背后的想法,对吧?)移动构造函数和const成员变量
但与C++ 0x移动构造函数我遇到了问题。由于析构函数也被称为“未加载”的对象,我需要防止清理资源句柄。由于成员变量是const我没有办法分配值-1或INVALID_HANDLE(或等价值),以指示析构函数,它不应该做任何事情。
如果一个对象的状态被移动到另一个对象时,有没有方法可以调用析构函数?
例子:
class File
{
public:
// Kind of "named constructor" or "static factory method"
static File open(const char *fileName, const char *modes)
{
FILE *handle = fopen(fileName, modes);
return File(handle);
}
private:
FILE * const handle;
public:
File(FILE *handle) : handle(handle)
{
}
~File()
{
fclose(handle);
}
File(File &&other) : handle(other.handle)
{
// The compiler should not call the destructor of the "other"
// object.
}
File(const File &other) = delete;
File &operator =(const File &other) = delete;
};
你的答案肯定是一种方式。但是与C++ 0x有关,我不喜欢析构函数必须检查是否应该真正发生解析的样式。他们是不是应该认为这个物体已经完全投入运行,现在已经成为毁灭的一点? – mazatwork 2011-06-11 18:28:16
@mazatwork:好吧,想想这样。假设你有一个复杂的对象,可能处于几种不同的状态,每个状态都需要一组不同的析构函数。例如,就像有一个缓存可能会或可能不会被初始化,或者可能需要或不需要关闭的数据库连接。当你没有关闭未在析构函数中打开的数据库连接时,你是不是“真的在破坏”?当然不是。这基本上是一回事。你仍然在摧毁,只是对象所在的状态不能满足很多工作。 – Omnifarious 2011-06-11 19:00:37
为什么不让移动构造函数做一些清理(如果它实际上是必要的),所以析构函数留下了真正的破坏。在我看来,这会更好。因为我们谈到同一个对象,双重破坏可能是不合理的。你用复杂对象的例子是我尝试避免使用像RAII和DI这样的技术的一个例子。 – mazatwork 2011-06-11 19:56:21