复制接口的 std::unique_ptr

Copying a std::unique_ptr of an interface

本文关键字:unique ptr std 接口 复制      更新时间:2023-10-16

我需要复制一些接口Interfacestd::unique_ptr<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深度复制到copy

这是

您的Interface类的问题,而不是unique_ptr。不能基于取消引用 Interface::data 的返回值来构造Interface类。

据推测,Interface是可复制构造和非多态的。如果是,您只需复制构造它:make_unique<Interface>(*ptr) .如果它不是可复制的,那么你根本无法复制Interface。如果它是多态类型,则无法正确复制它,除非该类型被显式编码为允许此类操作。

添加

virtual std::unique_ptr<Interface> clone() const = 0;

Interface. 在接口实现的最后一个类中实现它:

virtual std::unique_ptr<Interface> clone() const override final {
  return std::make_unique<Implementation>(*this);
}