复制从抽象类派生的对象
Posted
技术标签:
【中文标题】复制从抽象类派生的对象【英文标题】:Copy an object derived from an abstract class 【发布时间】:2018-05-05 12:11:28 【问题描述】:我有一个名为 component 的抽象基类。 它派生了非抽象类,如 resistor、generator 等...
在我的电路类中,我有一个名为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 这不是对我传递的组件的引用,而是对基(可实例化)类的引用
【参考方案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_ptr
和 std::make_unique
非常适合。
这创造了另一个机会:使用unique_ptr
,您甚至可以忘记克隆,只需将 unique_ptrs 作为对象传递,每个对象内部都有自己的具体类实例,并将它们存储在向量中。
【讨论】:
我无法完全理解第 2 步。您有什么好的资源可以详细解释 CRTP 吗?谢谢 您的 CRTP 实现无法编译。你需要静态地向下转换'this'。 谢谢,已修复。 有人可以检查这是否真的有效吗?我无法编译:/ @Magix 现在可以了(SO 的 android 应用几乎没用)。至于 CRTP,例如,您可以从 Wikipedia 开始:en.wikipedia.org/wiki/Curiously_recurring_template_pattern以上是关于复制从抽象类派生的对象的主要内容,如果未能解决你的问题,请参考以下文章
在以抽象基类为参数的函数中将指针和赋值运算符与派生类一起使用