C++ stl容器中基类的动态转换引用

C++ stl容器中基类的动态转换引用,c++,casting,pointer-container,C++,Casting,Pointer Container,是否可以按基类将一组对象存储在没有指针的std::list中。我真的希望对象保存在容器中,然后检索指向容器中对象的指针,并将其动态转换为正确的派生类 我使用指针可以很好地工作。比如(超级简单版): 类i组件 { 虚拟~Icomponent(){} } 类位置组件:公共IComponent { //... 浮动x,y; } std::列表CList; //... //填写清单 //在pComponent中放置对对象的引用 //... PositionComponent*

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

我使用指针可以很好地工作。比如(超级简单版):

类i组件
{   
虚拟~Icomponent(){}
}  
类位置组件:公共IComponent
{  
//...  
浮动x,y;
}
std::列表CList;
//...  
//填写清单
//在pComponent中放置对对象的引用
//...   
PositionComponent*position=dynamic\u cast(PCComponent)
位置->x=346452.235612;
但是内存管理是一个巨大的难题。我的实际结构是

map<enumValue, map<int, IComponent*> >
map
我觉得我不能使用对象本身,因为当我将任何派生组件添加到列表中时,额外的数据将被切断,只剩下基类。直到我尝试了静态播放,它才崩溃


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

要最大限度地减少手动内存管理的痛苦,请使用智能指针:
std::unique_ptr
如果您的编译器已经支持它,或者
boost::shared_ptr
,但是不要使用不应该在容器中使用的
std::auto_ptr
,要将手动内存管理的痛苦降至最低,请使用智能指针:
std::unique_ptr
,如果您的编译器已经支持它,或者
boost::shared_ptr
,但不是容器中不应该使用的
std::auto_ptr

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

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

如果没有,你真的被指针卡住了。通过使用智能指针,或者如果合适的话,使用boost
ptr
\u某种容器,可以使内存管理变得更加容易


此外,您可能会想,如果您需要再花一次迭代来考虑您的设计,以提供一个不需要执行
动态\u cast
即可重新获得原始类型的接口。

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

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

如果没有,你真的被指针卡住了。通过使用智能指针,或者如果合适的话,使用boost
ptr
\u某种容器,可以使内存管理变得更加容易

此外,您可能需要考虑是否需要再花一次迭代来考虑您的设计,以提供一个不需要执行
dynamic\u cast
来重新获得原始类型的接口

是否可以按基类将一组对象存储在say中 没有指针的std::列表

这个语句似乎是在C++的IMO视图中被约束的。因为STL容器只能保存同一类型的对象,如果将派生对象放在基类型容器中,它就会被切片。 因此,显然正常的解决方案是使用容器来保存基类型指针,就像您所做的那样(您可以使用boost/std进行内存管理)

如果您真的想将不同的对象存储在一个STL容器中,您可能需要考虑使用.< /P> 是否可以按基类将一组对象存储在say中 没有指针的std::列表

这个语句似乎是在C++的IMO视图中被约束的。因为STL容器只能保存同一类型的对象,如果将派生对象放在基类型容器中,它就会被切片。 因此,显然正常的解决方案是使用容器来保存基类型指针,就像您所做的那样(您可以使用boost/std进行内存管理)


如果您确实想在一个STL容器中存储不同的对象,你可能想考虑使用.< /p>是否有一个编译器和库支持<代码> STD::UnQuyJPPT?你有一个编译器和库来支持<代码> STD::UnQuyJPPT?这是基于一些例子的一个实体/组件系统的实现的一部分。如果一切顺利的话,我将有许多来自IComponent的派生。其中大部分都基于Java示例,其中所有内容都是指针。也许这是我的第一个错误。惯用的java和惯用的C++比语言的语法要远得多。这是我基于一些例子把一个实体/组件系统的一部分实现的一部分。如果一切顺利的话,我将有许多来自IComponent的派生。其中大部分都基于Java示例,其中所有内容都是指针。也许这是我的第一个错误。惯用的java和惯用的C++比语言的语法要远得多。
map<enumValue, map<int, IComponent*> >