Передача объектов оболочки ресурсов - PullRequest
0 голосов
/ 16 января 2019

Учтите, у меня есть класс, обертывающий ресурс:

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 своего конструктора перемещения или оператора присваивания перемещения.

Как я все еще могу передать дескриптор ресурсавокруг нескольких слоев вызовов функций и конструкторов без реализации семантики копирования?

...