【问题标题】:Storing multiple derived class types in a single list在单个列表中存储多个派生类类型
【发布时间】:2011-11-13 05:18:04
【问题描述】:

我想将从同一个基类派生的多个类类型存储在一个 stl 列表中。

如果我使用

list<BaseClass> L;

然后当我添加任何派生类时,我的代码编译得很好。但是,看起来我的派生类在存储之前会自动转换为基本类型。显然,我也想存储派生类型的唯一成员。我该怎么做?

【问题讨论】:

  • 我猜你的意思是多个对象。

标签: c++ list


【解决方案1】:

你必须使用

list<BaseClass *> L;

但是这样,您将遇到异常安全问题(当列表超出范围时,您在哪里销毁对象?如果之前抛出了一些异常怎么办?)。所以也许是这样的:

#include <list>
#include <tr1/memory>

std::list<std::tr1::shared_ptr<BaseClass> > L;

会更好。可以找到 TR1 基本信息,例如在wikipedia,它的documentation 在 boost 文档下。

【讨论】:

  • @KirilKirov 如果他提到这些智能指针也在 C++11 中并且你也可以使用 unique_ptr 如果你不需要开销,那只会是 +1 shared_ptr。我知道这可能并不都属于答案,但实际上他是从智能指针开始的人。
  • Christian Rau:我知道shared_ptr 开销。但现在它是唯一没有额外库 (Boost) 或不同标准 (C++11) 的解决方案。
【解决方案2】:

您需要将容器创建为list&lt; Baseclass* &gt;

list&lt; Baseclass&amp; &gt;(第二个有点危险)。(“删除”感谢@Cat Plus Plus 的评论)

通过使用list&lt; Baseclass &gt;,您会遇到slicing issue

【讨论】:

  • 你不能使用引用,因为引用是不可分配的。
【解决方案3】:

为了做你想做的事,你必须使用指针。一个可能的解决方案是std::list&lt;BaseClass*&gt;,但现在您必须处理复制、克隆、删除。更好的选择是使用Boost.Pointer Containers,它会自动为您执行此操作。

【讨论】:

    猜你喜欢
    • 2022-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2015-08-11
    • 2016-01-15
    • 2023-03-28
    • 2012-03-12
    相关资源
    最近更新 更多