Я использую идиому pimpl с const std::unique_ptr
для хранения реализации класса. Мой класс должен поддерживать создание копии и назначение копии. Что я хотел бы сделать, так это вручную вызвать конструктор копирования класса impl
внутри класса unique_ptr
. Однако я не вижу, как это сделать.
#include <memory>
struct potato {
potato();
~potato();
potato(const potato& p);
private:
struct impl;
const std::unique_ptr<impl> _pimpl;
};
struct potato::impl {
int carbs = 42;
};
potato::potato()
: _pimpl(std::make_unique<impl>()) {
}
potato::~potato() = default;
potato::potato(const potato& p) {
// Try to call the copy constructor of impl, stored in unique_ptr, not the
// unique_ptr copy-constructor (which doesn't exist).
_pimpl.get()->impl(p._pimpl); // This doesn't work.
}
Я проверил еще один вопрос о явном вызове конструктора копирования для объекта. В одном ответе рекомендуется использовать новое размещение.
Object dstObject;
new(&dstObject) Object(&anotherObject);
Могу ли я использовать это в моем конструкторе копирования? Если да, то как? Я не очень понимаю, что там происходит. Спасибо.
new(&dstObject) Object(&anotherObject);
является размещениемnew
и потребует от вас сначала вручную вызвать деструкторdstObject
. И тогда, если ваша конструкция не сработает, вы сильно облажались. - person François Andrieux   schedule 08.12.2018unique_ptr
бытьconst
? - person Galik   schedule 08.12.2018unique_ptr
. Просто удалитеconst
из_pimpl
и добавьте в исходный код назначение перемещения и определения ctor по умолчанию. - person Julien Villemure-Fréchette   schedule 08.12.2018