繁体   English   中英

铸造weak_ptr<ibase> 到weak_ptr<derived></derived></ibase>

[英]Casting weak_ptr<IBase> to weak_ptr<Derived>

我正在尝试使用智能指针创建带有接口库的 object 池。 但是,我无法访问派生的 object 而不将其从weak_ptr 转换为原始指针,这会破坏智能指针的用途。 它还警告我它容易受到悬空指针 state 的攻击。

是的,代码可以编译,但我不喜欢警告,目前无论如何它都不应该是 100% 安全的。

std::weak_ptr<IPooledObject> weakPtr = poolManager.SpawnFromPool();
if (EnemyEntity* enemy0 = reinterpret_cast<EnemyEntity*>(weakPtr.lock().get()))

C26815:指针悬空,因为它指向已销毁的临时实例。

现在我真正想要的是将带有从 poolManager.SpawnFromPool() 返回的 IPooledObject 的 weak_ptr 转换为另一个带有派生的 class EnemyEntity 的weak_ptr。

std::weak_ptr<EnemyEntity> enemy0 = poolManager.SpawnFromPool();

最后一个代码片段是我理想的使用方式,但它无法编译。 我自己无法弄清楚如何在两种弱指针类型(从 IBase 到 Derived)之间进行转换的正确语法。 有人可以帮忙吗?

为避免悬空指针问题,您需要确保shared_ptr在您需要访问 object 的整个时间内都处于活动状态。 然后,使用dynamic_pointer_cast在指针上执行dynamic_cast

if (auto sharedPtr = weakPtr.lock()) {
    std::weak_ptr enemy0 = std::dynamic_pointer_cast<EnemyEntity>(sharedPtr);
} else {
    // weakPtr has expired
}

您可以在 static 指针转换的帮助下在一行中完成

std::weak_ptr<Derived> enemy0 = std::static_pointer_cast<Derived>(poolManager.SpawnFromPool().lock());

暂无
暂无

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

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