std :: list可以包含不同的std :: unique_ptr ?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了std :: list可以包含不同的std :: unique_ptr ?相关的知识,希望对你有一定的参考价值。
所以,我正在为Qub3d引擎制作游戏经理类,我希望每个GameState
都是std::unique_ptr
我所拥有的每个GameState如mainMenu
都是GameState
的子类
我需要std::list(or something)
为每个州包含不同的unique_ptrs,例如mainMenu
和mainGame
。
我试过std::list< std::unique_ptr<GameState> > stateStack;
,但是当我尝试这样做时:stateStack.push_back(m_mainMenu);
我得到一个关于重载的C2664错误,不包括mainMenu类。 (不知道这是否相关,但我使用的是MSVC)
我怎么做到这一点?这甚至可能吗?
这绝对是可能的,但你需要改变你对指针的看法。
unique_ptr
意味着只保留一个指向对象的指针。它管理它指向的对象的生命周期,从而有助于防止可能的内存错误和错误。
因此,应该在它所居住的背景下定义unique_ptr
。你不能只是随机指向一个数据结构,并让它成为一个unique_ptr
。
在std::vector
方面,您可以将emplace_back()
函数与new
运算符结合使用。这个函数实际上处理有问题的对象的初始化,而不是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
。
以上是关于std :: list可以包含不同的std :: unique_ptr ?的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 调试器:轻松查看 std::list(和其他 std 容器)