我有一个智能指针列表,其中每个指针指向一个单独的实体类。
std::list<std::unique_ptr<Entity>> m_entities;
我希望构造函数处理将每个指针分配给 std::list 类,因为它是由类实例化的代码“自动”处理的。但是,如果这种设计不好,那么我会欢迎一个更好的选择,因为它只对来自 C# 背景的我有意义。
Entity::Entity(Game &game)
: m_game(game),
m_id(m_game.g_idGenerator->generateNewID())
{
m_game.m_entities.push_back(std::unique_ptr<Entity>(this));
}
我使用此方法遇到的主要问题是 Entity 类的生命周期不受 Entity 类管理。
例如,如果我在堆栈上分配一个实体类,它将在离开分配它的方法后调用实体析构函数,并且指针将不再有效。
因此,我考虑了创建智能指针的替代方法,将实体类分配给堆,然后显式地将指针添加到列表中。
std::unique_ptr<Entity> b(new Entity(*this));
m_entities.push_back(b); // ERROR
这会产生以下错误
error C2664: 'void std::list<_Ty>::push_back(_Ty &&)' : cannot convert parameter 1 from 'std::unique_ptr<_Ty>' to 'std::unique_ptr<_Ty> &&'
将每个指针分配给列表的最佳方法被认为是什么,并且基于构造函数的版本是否可能?
我目前认为智能指针列表应该处理每个实体类的生命周期,并且在构造函数中分配指针不是一个好的设计选择。在这种情况下,我可能应该创建一个 CreateEntity 方法来添加指向列表的指针,而不是让构造函数处理它。这是否更好?
在阅读了此处、此处和此处(场外)的问题后,我考虑了哪种类型的智能指针适合此操作。根据我目前所读到的内容,很难得到准确的答案,因为它们都提供了一些相互矛盾的建议。