【发布时间】:2022-01-16 09:56:12
【问题描述】:
我正在尝试使用智能指针创建具有接口库的对象池。但是,如果不将其从weak_ptr 转换为原始指针,我就无法访问派生对象,这会破坏智能指针的用途。它还警告我它容易受到悬空指针状态的影响。
是的,代码可以编译,但我不喜欢警告,而且目前它不应该是 100% 安全的。
std::weak_ptr<IPooledObject> weakPtr = poolManager.SpawnFromPool();
if (EnemyEntity* enemy0 = reinterpret_cast<EnemyEntity*>(weakPtr.lock().get()))
C26815:指针悬空,因为它指向已销毁的临时实例。
现在我真正想要的是将具有从 poolManager.SpawnFromPool() 返回的 IPooledObject 的 weak_ptr 转换为另一个具有派生类 EnemyEntity 的 weak_ptr。
std::weak_ptr<EnemyEntity> enemy0 = poolManager.SpawnFromPool();
最后一个代码 sn-p 是我理想的使用方式,但它无法编译。我自己无法弄清楚如何在两种弱指针类型(从 IBase 到 Derived)之间进行转换的正确语法。有人可以帮忙吗?
【问题讨论】:
标签: c++ smart-pointers