【发布时间】:2011-11-13 05:18:04
【问题描述】:
我想将从同一个基类派生的多个类类型存储在一个 stl 列表中。
如果我使用
list<BaseClass> L;
然后当我添加任何派生类时,我的代码编译得很好。但是,看起来我的派生类在存储之前会自动转换为基本类型。显然,我也想存储派生类型的唯一成员。我该怎么做?
【问题讨论】:
-
我猜你的意思是多个对象。
我想将从同一个基类派生的多个类类型存储在一个 stl 列表中。
如果我使用
list<BaseClass> L;
然后当我添加任何派生类时,我的代码编译得很好。但是,看起来我的派生类在存储之前会自动转换为基本类型。显然,我也想存储派生类型的唯一成员。我该怎么做?
【问题讨论】:
你必须使用
list<BaseClass *> L;
但是这样,您将遇到异常安全问题(当列表超出范围时,您在哪里销毁对象?如果之前抛出了一些异常怎么办?)。所以也许是这样的:
#include <list>
#include <tr1/memory>
std::list<std::tr1::shared_ptr<BaseClass> > L;
会更好。可以找到 TR1 基本信息,例如在wikipedia,它的documentation 在 boost 文档下。
【讨论】:
unique_ptr 如果你不需要开销,那只会是 +1 shared_ptr。我知道这可能并不都属于答案,但实际上他是从智能指针开始的人。
shared_ptr 开销。但现在它是唯一没有额外库 (Boost) 或不同标准 (C++11) 的解决方案。
您需要将容器创建为list< Baseclass* >
或(“删除”感谢@Cat Plus Plus 的评论)list< Baseclass& >(第二个有点危险)。
通过使用list< Baseclass >,您会遇到slicing issue。
【讨论】:
为了做你想做的事,你必须使用指针。一个可能的解决方案是std::list<BaseClass*>,但现在您必须处理复制、克隆、删除。更好的选择是使用Boost.Pointer Containers,它会自动为您执行此操作。
【讨论】: