gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:36:25 25 4
gpt4 key购买 nike

所以,我正在为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com