[英]can a std::list contain different std::unique_ptr<T>?
因此,我正在为Qub3d Engine创建游戏管理器类,并且我希望每个GameState
都应该是std::unique_ptr
每个游戏状态如mainMenu
我已经是一个子类的GameState
我需要std::list(or something)
包含不同unique_ptrs每个状态如mainMenu
和mainGame
。
我已经尝试过std::list< std::unique_ptr<GameState> > stateStack;
,但是当我尝试执行以下操作时: stateStack.push_back(m_mainMenu);
我收到有关不包括mainMenu类的重载的C2664错误。 (不知道这是否相关,但是我正在使用MSVC)
我将如何完成? 甚至有可能吗?
这是绝对可能的,但是您需要更改对指针的看法。
unique_ptr
表示保证只有一个指向该对象的指针。 它管理指向的对象的生命周期,从而有助于防止可能的内存错误和错误。
因此,应该在其生存的上下文中定义一个unique_ptr
。 您不能只将随机指针传递给数据结构并使它成为 unique_ptr
。
就std::vector
,您可以将emplace_back()
函数与new
运算符结合使用。 与push_back()
(仅将现有对象添加到数据结构中push_back()
相反,该函数实际上处理有关对象的初始化 。
std::vector<std::unique_ptr<Dog>> dogshow;
dogshow.emplace_back(new Dog());
dogshow[0]->speak(); // outputs "woof", consistent with my Dog class.
很简单, emplace_back
函数接管unique_ptr
的声明。
如果您绝对要使用std::list
代替,则提供类似的emplace
函数。 许多C ++标准数据结构都可以。
注意:如果要对unique_ptr
进行智能内存管理,但要具有指向同一对象的多个指针,则应查看shared_ptr
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.