我有一个名为 component 的抽象基类。 它派生了非抽象类,如电阻, generator 等......
在我的 circuit 类中,我有一个名为std::vector<sim::component*>
的异构component_list
,我用它来处理插入电路中的所有组件。
然后我有以下功能:
void circuit::insert(sim::component& comp, std::vector<sim::node*> nodes)
在函数定义中,我想复制名为comp
的组件
为了在我的component_list中插入指向它的指针
(这样我就可以管理它的生命周期)
我尝试过这些方法:
sim::component *copy = new sim::component(comp)
但当然,sim :: component是抽象的,我无法实现它
如何制作对象的副本,在编译时真正的类是未知的?
答案 0 :(得分:3)
解决这个问题的一种传统方法是让对象自己克隆,再加上一些CRTP。
予。首先,使您的抽象类可克隆:
struct Component {
virtual Component *clone() const = 0;
virtual ~Component() {}
};
现在,每个组件都应该定义自己的clone()
实现。
II。这很容易通过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_ptrs作为对象传递,每个对象都有自己的具体类实例,并将它们存储在向量中。