我喜歡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