所以,我正在为 Qub3d 引擎创建一个游戏管理器类,我想要每个 GameState
成为std::unique_ptr
每个游戏状态,例如 mainMenu
我拥有的是 GameState
的子类
我需要 std::list(or something)
为每个状态包含不同的 unique_ptr,例如 mainMenu
和 mainGame
.
我试过了 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/