dynamic_cast对stl容器中基类的引用

时间:2011-08-03 21:12:14

标签: c++ casting pointer-container

是否可以通过基类来存储一堆对象,比如说没有指针的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并且它崩溃时,这才算出来。

可以回答我原来的问题和/或确认我对此事的感受。谢谢!

3 个答案:

答案 0 :(得分:3)

最小化手动内存管理的痛苦使用智能指针:std::unique_ptr如果您的编译器已经支持它或boost::shared_ptr,但不是std::auto_ptr不应该在容器中使用

答案 1 :(得分:2)

正如您所猜测的那样,当您按值将对象存储在容器中时,它会被切片并且数据会被切断。

如果您只需要存储一种数据类型(您只在代码中显示一种),那么您可以使容器保持该类型。

如果没有,你真的被使用了指针。通过使用智能指针,或者在适当的情况下,使用某种类型的boost ptr _容器,可以使内存管理变得更加容易。

此外,您可能需要考虑是否需要再花一次迭代考虑您的设计,以提供一个不需要执行dynamic_cast的界面来重新获得原始类型。

答案 2 :(得分:0)

  

是否可以通过基类存储一堆对象   一个没有指针的std :: list。

这句话似乎在C ++的角度来看是有争议的IMO。因为STL容器只能容纳相同类型的对象,所以如果将派生对象放入基类型容器中,它就会被切片。

所以明显的正常解决方案是使用容器来保存基类型指针(你可以使用boost / std smart pointer进行内存管理)

如果您确实想在一个STL容器中存储不同的对象,可能需要考虑使用boost::any