std :: list可以包含不同的std :: unique_ptr ?

问题描述 投票:0回答:1

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

我怎么做到这一点?这甚至可能吗?

c++ stack unique-ptr stdlist
1个回答
2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.