std::list 可以包含不同的 std::unique_ptr<T> 吗?
can a std::list contain different std::unique_ptr<T>?
所以,我正在为 Qub3d 引擎制作一个游戏管理器 class,我希望每个 GameState
都是一个 std::unique_ptr
我拥有的每个 GameState(例如 mainMenu
)都是 GameState
的子 class
我需要 std::list(or something)
为每个州包含不同的 unique_ptrs,例如 mainMenu
和 mainGame
。
我已经尝试过 std::list< std::unique_ptr<GameState> > stateStack;
,但是当我尝试这样做时:stateStack.push_back(m_mainMenu);
我收到一个关于不包括主菜单 class 的过载的 C2664 错误。 (不知道这是否相关,但我正在使用 MSVC)
我将如何做到这一点?
这可能吗?
这绝对有可能,但你需要改变你对指针的看法。
A unique_ptr
表示保证只有一个指向该对象的指针。它管理它指向的对象的生命周期,从而有助于防止可能的内存错误和错误。
因此,unique_ptr
应该在其存在的上下文中定义。你不能只是将一个随机指针交给一个数据结构并让它 变成 一个 unique_ptr
.
在std::vector
方面,可以结合new
运算符使用emplace_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
。
所以,我正在为 Qub3d 引擎制作一个游戏管理器 class,我希望每个 GameState
都是一个 std::unique_ptr
我拥有的每个 GameState(例如 mainMenu
)都是 GameState
我需要 std::list(or something)
为每个州包含不同的 unique_ptrs,例如 mainMenu
和 mainGame
。
我已经尝试过 std::list< std::unique_ptr<GameState> > stateStack;
,但是当我尝试这样做时:stateStack.push_back(m_mainMenu);
我收到一个关于不包括主菜单 class 的过载的 C2664 错误。 (不知道这是否相关,但我正在使用 MSVC)
我将如何做到这一点? 这可能吗?
这绝对有可能,但你需要改变你对指针的看法。
A unique_ptr
表示保证只有一个指向该对象的指针。它管理它指向的对象的生命周期,从而有助于防止可能的内存错误和错误。
因此,unique_ptr
应该在其存在的上下文中定义。你不能只是将一个随机指针交给一个数据结构并让它 变成 一个 unique_ptr
.
在std::vector
方面,可以结合new
运算符使用emplace_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
。