【问题标题】:dynamic_cast reference to base class in stl container对 stl 容器中基类的 dynamic_cast 引用
【发布时间】:2011-08-03 21:12:13
【问题描述】:

是否可以通过它们的基类将一堆对象存储在没有指针的 std::list 中。我真的很希望将对象保存在容器中,然后检索指向容器中对象的指针并将其动态转换为正确的派生类。

我使用指针可以正常工作。点赞(超简单版):

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 并且它崩溃时才知道这一点。

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

【问题讨论】:

  • 你有支持std::unique_ptr的编译器和库吗?

标签: c++ casting pointer-container


【解决方案1】:

为了最大程度地减少手动内存管理的痛苦,请使用智能指针:std::unique_ptr(如果您的编译器已经支持它)或boost::shared_ptr,但不是std::auto_ptr,因为它不应该在容器中使用

【讨论】:

    【解决方案2】:

    如您所料,当您将对象按值存储在容器中时,它会被切片并且数据会被截断。

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

    如果没有,你真的会被指针卡住。您可以通过使用智能指针或适当的提升ptr_container 来简化内存管理。

    此外,您可能还想考虑是否需要再进行一次迭代,以考虑您的设计以提供不需要执行dynamic_cast 即可再次恢复原始类型的界面。

    【讨论】:

    • 这是我根据一些示例组合起来的实体/组件系统实现的一部分。如果一切顺利,我将有许多来自 IComponent 的派生。其中大部分基于 Java 示例,其中 EVERYTHING 是一个指针。也许那是我的第一个错误。
    • 惯用的 Java 和惯用的 C++ 比语言的语法所指示的要大得多。
    【解决方案3】:

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

    这句话在 C++ 观点 IMO 中似乎是矛盾的。因为 STL 容器只能容纳相同类型的对象,如果将派生对象放入基类型容器中,它就会被切片。

    因此,显而易见的正常解决方案是像您一样使用容器来保存基类型指针(您可以使用 boost/std smart pointer 进行内存管理)

    如果你真的想在一个 STL 容器中存储不同的对象,你可以考虑使用boost::any

    【讨论】:

      猜你喜欢
      • 2011-06-22
      • 2014-11-19
      • 2016-01-13
      • 2021-03-18
      • 2014-09-10
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多