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,例如mainMenumainGame

我试过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 容器)

包含std :: list的结构的c ++初始化[重复]

指向 std::vector 和 std::list 元素的指针

如何在结构的`std::list`中搜索?

如何从 dll 正确返回 std::list

C++ STL应用与实现6: 如何使用std::list