Мне нравится идея константных членских переменных, особенно когда я переношу функции C в классы. Конструктор принимает дескриптор ресурса (например, дескриптор файла), который остается действительным в течение всего времени жизни объекта, и деструктор, наконец, закрывает его. (Это идея RAII, правда?)
Но с конструктором перемещения С++ 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;
};