std :: list是否可以包含不同的std :: unique_ptr <t>?

时间:2018-03-05 04:53:44

标签: c++ stack unique-ptr stdlist

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

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

1 个答案:

答案 0 :(得分:2)

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

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,那么它会提供类似的unique_ptr功能。许多C ++标准数据结构都可以。

注意:如果您想要shared_ptr的智能内存管理,但希望拥有指向同一对象的多个指针,则应该查看--output-file