Учтите, у меня есть класс, обертывающий ресурс:
class A {
public:
A(Data data) : handle(aquire_resource(data)) {}
A(A &&temp) : handle(temp.handle) { temp.handle = 0; }
~A() { lib_destroy(handle); }
A &operator=(A &&temp);
private:
int handle;
};
Этот класс не имеет конструктора копирования или назначения копирования, так как дескриптор ресурса должен быть уникальным во всех экземплярах класса A - мы не хотимресурс, который должен быть освобожден, в то время как другой объект-оболочка еще знает о дескрипторе.
Теперь я хочу, чтобы другие классы могли получить контроль над ресурсом, используя переменные-члены класса-оболочки:
class B {
public:
B(A res, Stuff stuff) : res(res), stuff(stuff) {}
private:
A res;
Stuff stuff;
};
Теперь подумайте, что мне нужно подготовиться к этому ресурсу, прежде чем приобретать его.Мне нужна функция загрузчика, чтобы позаботиться о некоторых вещах и затем вернуть ресурс, потому что данные, требуемые для ресурса, могут быть получены из вычислений или из файла, например.Таким образом, создание конструктора для Wrapper, который принимает файл, связывает реализацию оболочки с тем, как необходимые данные анализируются и подготавливаются.Я не считаю это мудрым.Таким образом, подготовка данных происходит в другом месте, например:
A loader(std::string filename) {
//open file
Data data;
//read data from file
return A(data);
}
Проблема в том, как структурирована A, я не могу создать объекты B в виде:
B b(loader("foo"), stuff);
потому что в конструкторе B экземпляр A получает адрес, поэтому он больше не может быть привязан к && a своего конструктора перемещения или оператора присваивания перемещения.
Как я все еще могу передать дескриптор ресурсавокруг нескольких слоев вызовов функций и конструкторов без реализации семантики копирования?