Entity
对象的唯一所有者是EntityManager
。
class EntityManager
{
public:
std::weak_ptr<Entity> vs std::shared_ptr<Entity> getEntityByID(int ID) const;
private:
std::vector<std::shared_ptr<Entity>> entities;
};
当程序中需要使用Entity
时,使用getEntityByID
函数从EntityManager
接收。
Entity
不应该作为shared_ptr
存储在程序中的其他位置,因为EntityManager
是唯一的所有者,但它可以作为weak_ptr
存储在许多位置。
我的问题是,getEntityByID
是否应该返回weak_ptr
或shared_ptr
我使用weak_ptr
作为返回值的论点:
- 在getEntityByID函数签名中很清楚,weak_ptr应该在获取Entity之后使用
使用shared_ptr
作为返回值的参数:
weak_ptr
无论如何都可以转换为shared_ptr
,然后可以存储为CCD_ 17在其他地方。另外,每次使用时,都会使用lock
函数将其转换为shared_ptr- 当使用
shared_ptr
时,在每个函数中它都可以通过CCD_ 20。不再需要每次使用ptr都使用lock
函数。如果它能决定要存储指针,只需将其作为数据成员复制到weakptr
如果像您所说的EntityManager是实体的唯一所有者,则应将实体存储为unique_ptr,而不是shared_ptr。在更改为unique_ptr的矢量后,应该从.get()方法返回原始指针。理想情况下,EntityManager可以将Entites存储为对象而不是指针,并返回对存储对象的引用或常量引用。
shared_ptr
用于共享所有权。存储在shared_ptr
中的任何对象都不认为它具有确定对象生存期的唯一权限。
即使每个人都存储weak_ptr
,每当他们使用时,他们都会将其转换为shared_ptr
,在使用时,有人可能会试图在中央管理器中删除它。这将失败,因为存在"临时"shared_ptr
。
在中等复杂的情况下,这种情况会发生,而简单的测试不会暴露它,导致以后很难对错误进行推理。
您可以使用弱/共享来解决这个问题,但只能作为实现细节:语义必须在智能指针之上强制执行。这些语义将决定所使用的智能指针。