代码之家  ›  专栏  ›  技术社区  ›  Magix

复制从抽象类派生的对象

  •  1
  • Magix  · 技术社区  · 6 年前

    我有一个抽象基类,名为 组成部分 。 它派生了非抽象类,如 电阻器 ,则, 发电机

    在我的 环行 同学们,我有一个 std::vector<sim::component*> 已命名 component_list ,用于处理插入到回路中的所有元件。

    然后我有以下功能:

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

    在函数定义中,我想复制名为 comp 为了在我的component\u列表中插入指向它的指针 (这样我就可以管理它的生命周期)

    我试过这样的方法:

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

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

    我如何复制对象,哪个真实的类在编译时是未知的?

    1 回复  |  直到 6 年前
        1
  •  3
  •   bipll    6 年前

    解决这个问题的一种传统方法是让对象克隆自己,再加上一点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_ptr 很合身,还有 std::make_unique

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