我需要复制某个界面std::unique_ptr<Interface>
的{{1}}。
This post总结它很好,但它在我的情况下不起作用,因为Interface
没有可用的构造函数。
示例:
Interface
有没有办法将//Pointer to copy
std::unique_ptr<Interface> ptr = std::make_unique<Interface>();
//error: incomplete type is not allowed
std::unique_ptr<Interface> copy{ new Interface(*ptr.get().data) };
深度复制到ptr
?
答案 0 :(得分:3)
这是Interface
课程的问题,而不是unique_ptr
。无法基于取消引用Interface
的返回值来构建您的Interface::data
类。
据推测,Interface
是可复制构造和非多态的。如果是,您只需复制构造它:make_unique<Interface>(*ptr)
。如果它不是可复制构造的,那么你根本无法复制Interface
。如果它是多态类型,那么你无法正确复制它,除非明确编码类型以允许这样的事情。
答案 1 :(得分:3)
添加
virtual std::unique_ptr<Interface> clone() const = 0;
致Interface
。使用以下命令在接口的最终实现类中实现它:
virtual std::unique_ptr<Interface> clone() const override final {
return std::make_unique<Implementation>(*this);
}