std::list 可以包含不同的 std::unique_ptr<T> 吗?

can a std::list contain different std::unique_ptr<T>?

所以,我正在为 Qub3d 引擎制作一个游戏管理器 class,我希望每个 GameState 都是一个 std::unique_ptr

我拥有的每个 GameState(例如 mainMenu)都是 GameState

的子 class

我需要 std::list(or something) 为每个州包含不同的 unique_ptrs,例如 mainMenumainGame

我已经尝试过 std::list< std::unique_ptr<GameState> > stateStack;,但是当我尝试这样做时:stateStack.push_back(m_mainMenu); 我收到一个关于不包括主菜单 class 的过载的 C2664 错误。 (不知道这是否相关,但我正在使用 MSVC)

我将如何做到这一点? 这可能吗?

这绝对有可能,但你需要改变你对指针的看法。

A unique_ptr 表示保证只有一个指向该对象的指针。它管理它指向的对象的生命周期,从而有助于防止可能的内存错误和错误。

因此,unique_ptr 应该在其存在的上下文中定义。你不能只是将一个随机指针交给一个数据结构并让它 变成 一个 unique_ptr.

std::vector方面,可以结合new运算符使用emplace_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