gpt4 book ai didi

c++ - 复制从抽象类派生的对象

转载 作者:行者123 更新时间:2023-11-30 02:19:59 25 4
gpt4 key购买 nike

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

在我的电路 类中,我有一个异类 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 是抽象的,我无法实例化它

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

最佳答案

解决它的一种传统方法是让对象克隆自己,再加上一点 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_ptr 作为对象传递,每个对象内部都有自己的具体类实例,并将它们存储在一个 vector 中。

关于c++ - 复制从抽象类派生的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50189277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com