繁体   English   中英

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

[英]can a std::list contain different std::unique_ptr<T>?

因此,我正在为Qub3d Engine创建游戏管理器类,并且我希望每个GameState都应该是std::unique_ptr

每个游戏状态如mainMenu我已经是一个子类的GameState

我需要std::list(or something)包含不同unique_ptrs每个状态如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() (仅将现有对象添加到数据结构中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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM