是否可以通过基类来存储一堆对象,比如说没有指针的std :: list。我真的希望在容器中保存对象,然后检索指向容器中对象的指针,并使用dynamic_cast来更正派生类。
我使用指针工作正常。喜欢(超级简单版):
class IComponent
{
virtual ~Icomponent(){}
}
class PositionComponent: public IComponent
{
//...
float x, y;
}
std::list<IComponent*> CList;
//...
// fill the list
// put reference to object in pComponent
//...
PositionComponent* position = dynamic_cast<PositionComponent*>( pComponent)
position->x = 346452.235612;
但内存管理是一个巨大的痛苦。我的实际结构是
map<enumValue, map<int, IComponent*> >
我感觉我无法使用对象本身,因为当我将任何派生组件添加到列表中时,额外的数据将被切断并仅留下基类。直到我尝试使用static_cast并且它崩溃时,这才算出来。
可以回答我原来的问题和/或确认我对此事的感受。谢谢!
答案 0 :(得分:3)
最小化手动内存管理的痛苦使用智能指针:std::unique_ptr
如果您的编译器已经支持它或boost::shared_ptr
,但不是std::auto_ptr
不应该在容器中使用1}} p>
答案 1 :(得分:2)
正如您所猜测的那样,当您按值将对象存储在容器中时,它会被切片并且数据会被切断。
如果您只需要存储一种数据类型(您只在代码中显示一种),那么您可以使容器保持该类型。
如果没有,你真的被使用了指针。通过使用智能指针,或者在适当的情况下,使用某种类型的boost ptr
_容器,可以使内存管理变得更加容易。
此外,您可能需要考虑是否需要再花一次迭代考虑您的设计,以提供一个不需要执行dynamic_cast
的界面来重新获得原始类型。
答案 2 :(得分:0)
是否可以通过基类存储一堆对象 一个没有指针的std :: list。
这句话似乎在C ++的角度来看是有争议的IMO。因为STL容器只能容纳相同类型的对象,所以如果将派生对象放入基类型容器中,它就会被切片。
所以明显的正常解决方案是使用容器来保存基类型指针(你可以使用boost / std smart pointer进行内存管理)
如果您确实想在一个STL容器中存储不同的对象,可能需要考虑使用boost::any。