为类似值的类复制shared_ptr <interface>

时间:2018-05-06 15:01:18

标签: c++ c++11 polymorphism shared-ptr

这是我的问题。我有一个接口和两个派生类:

class Interface
{
public:
    virtual void f() = 0;
};
class Derived1 : public Interface;
class Derived2 : public Interface;

然后,我还有一个包含shared_ptr的Value类,其目的是指向两个派生类中的一个:

class Value
{
public:
     Value();
     Value(const Value&);
private:
     shared_ptr<Interface> p_;
};

由于我希望我的Value类像值一样运行,我希望我的复制构造函数能够复制指向的Derived对象。但是,我不能写

Value::Value(const Value& value) : 
    p_(make_shared<Interface>(*value.p_))
{ }

因为Interface包含纯虚函数。 *value.p_必须是派生类型。我不知道如何妥善处理这个问题。

提前致谢。

2 个答案:

答案 0 :(得分:0)

  

我不知道如何妥善管理这个问题。

为什么不使用虚拟clone()方法?

class Interface
{
public:
  virtual void f() = 0;
  virtual std::shared_ptr<Interface> clone()=0;
};

class Derived1 : public Interface {
    void f() {};
  std::shared_ptr<Interface> clone()
  {
    return std::make_shared<Derived1>(*this);
  }
};

然后在你的拷贝构造函数中,你可以使用类似下面的东西来复制指针:

Value::Value(const Value& value)
{
    this->p_ = value.p_->clone();
}

以此为例:http://www.cs.technion.ac.il/users/yechiel/c++-faq/copy-of-abc-via-clone.html

答案 1 :(得分:0)

这个问题正是建议的polymorphic_value要解决的问题(它赋予多态对象价值语义)。

polymorphic_value<T>可以拥有并执行从T派生的对象的深层副本。

ISO C ++提案在http://wg21.link/p0201

参考实施在这里https://github.com/jbcoe/polymorphic_value

我是论文和参考实现的作者。

我发现polymorphic_value可用于删除大量难以编写的样板代码。我有兴趣知道它是否也解决了你的问题。