【问题标题】:Copy an object derived from an abstract class复制从抽象类派生的对象
【发布时间】:2018-05-05 12:11:28
【问题描述】:

我有一个名为 component 的抽象基类。 它派生了非抽象类,如 resistorgenerator 等...

在我的电路类中,我有一个名为component_list的异构std::vector<sim::component*>,我用它来处理电路中插入的所有组件。

然后我有以下功能:

void circuit::insert(sim::component& comp, std::vector<sim::node*> nodes)

在函数定义中,我要复制名为comp的组件 为了在我的 component_list 中插入指向它的指针 (这样我就可以管理它的生命周期)

我尝试了一些类似的方法:

sim::component *copy = new sim::component(comp)

当然,sim::component 是抽象的,我无法实例化它

如何制作对象的副本,在编译时哪个真正的类是未知的?

【问题讨论】:

  • 也许是virtual 克隆函数?
  • 可以工作,但感觉我不需要更改类来实现这一点......好吧,也许我别无选择?或者也许可以使用insert 的模板版本来完成? (只是突然出现在我的脑海中)
  • 如果你不能实例化component,你如何传递对它的引用?
  • @KillzoneKid 这不是对我传递的组件的引用,而是对基(可实例化)类的引用

标签: c++ pointers inheritance copy abstract-class


【解决方案1】:

解决这个问题的一种传统方法是让对象克隆自己,加上一点 CRTP。

我。首先,让抽象类可克隆:

struct Component {
    virtual Component *clone() const = 0;
    virtual ~Component() {}
};

现在,每个组件都应该定义自己的 clone() 实现。

二。通过 CRTP 可以轻松实现自动化:

template<class Concrete> struct CompBase: Component {
    Component *clone() const {
        return new Concrete(static_cast<Concrete const &>(*this));
    }
    virtual ~CompBase() {}
};

struct Generator: CompBase<Generator>;  // already has clone() defined

请注意,我在示例中使用了普通指针,但通常建议使用更智能的类比。 std::unique_ptrstd::make_unique 非常适合。

这创造了另一个机会:使用unique_ptr,您甚至可以忘记克隆,只需将 unique_ptrs 作为对象传递,每个对象内部都有自己的具体类实例,并将它们存储在向量中。

【讨论】:

  • 我无法完全理解第 2 步。您有什么好的资源可以详细解释 CRTP 吗?谢谢
  • 您的 CRTP 实现无法编译。你需要静态地向下转换'this'。
  • 谢谢,已修复。
  • 有人可以检查这是否真的有效吗?我无法编译:/
  • @Magix 现在可以了(SO 的 Android 应用几乎没用)。至于 CRTP,例如,您可以从 Wikipedia 开始:en.wikipedia.org/wiki/Curiously_recurring_template_pattern
猜你喜欢
  • 1970-01-01
  • 2020-09-01
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多