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

标签 c++ stack unique-ptr stdlist

所以,我正在为 Qub3d 引擎创建一个游戏管理器类,我想要每个 GameState成为std::unique_ptr

每个游戏状态,例如 mainMenu我拥有的是 GameState 的子类

我需要 std::list(or something)为每个状态包含不同的 unique_ptr,例如 mainMenumainGame .

我试过了 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() 相反,后者仅将现有对象添加到数据结构。

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

关于c++ - std::list 可以包含不同的 std::unique_ptr<T> 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49103676/

相关文章:

c++ - C++03 中 std::unique_ptr 的模拟

c++ - 有没有办法将 cin.fail 和 cin.clear 翻译成 C 编程语言?

c++ - C++ 中的父子关系

c - main 在 C 中是否有返回地址、动态链接或返回值?

c - 使用 RtlVirtualUnwind api 检索参数

c++ - 包装的 unique_ptr 的模板化 move 构造函数

c++ - std::unique_ptr 的推荐用法

c++ - 为什么 valgrind 将 64 位程序中的指针大小报告为 4 个字节

C++ 异构类型数组

c++ - 在类构造函数中动态定义堆栈,它是私有(private)成员