首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将weak_ptr<IBase>铸造为weak_ptr<Derived>

将weak_ptr<IBase>铸造为weak_ptr<Derived>
EN

Stack Overflow用户
提问于 2021-12-12 17:29:32
回答 2查看 194关注 0票数 0

我正在尝试使用智能指针创建带有接口库的对象池。但是,如果不将派生对象从weak_ptr转换为原始指针,则无法访问派生对象,这会扼杀智能指针的用途。此外,它还警告我,它容易受到悬空指针状态的影响。

是的,代码编译,但我不喜欢警告,目前它不应该是100%安全的,不管怎么说。

代码语言:javascript
复制
std::weak_ptr<IPooledObject> weakPtr = poolManager.SpawnFromPool();
if (EnemyEntity* enemy0 = reinterpret_cast<EnemyEntity*>(weakPtr.lock().get()))

C26815:指针正在悬空,因为它指向一个被销毁的临时实例。

现在,我真正想要的是将weak_ptr与从poolManager.SpawnFromPool()返回的IPooledObject转换为另一个weak_ptr,而不是派生类EnemyEntity。

代码语言:javascript
复制
std::weak_ptr<EnemyEntity> enemy0 = poolManager.SpawnFromPool();

最后一个代码片段是我理想中想要使用的方式,但它不编译。我自己不知道如何在两个弱指针类型(从IBase到派生)之间转换正确的语法。有人能帮忙吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-12 17:37:55

为了避免悬空指针问题,您需要确保shared_ptr在您需要访问对象的整个时间内都是活动的。然后,使用dynamic_pointer_cast在切入点上执行dynamic_cast

代码语言:javascript
复制
if (auto sharedPtr = weakPtr.lock()) {
    std::weak_ptr enemy0 = std::dynamic_pointer_cast<EnemyEntity>(sharedPtr);
} else {
    // weakPtr has expired
}
票数 1
EN

Stack Overflow用户

发布于 2021-12-12 17:48:12

您可以使用静态指针强制转换在一行中完成此操作。

代码语言:javascript
复制
std::weak_ptr<Derived> enemy0 = std::static_pointer_cast<Derived>(poolManager.SpawnFromPool().lock());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70325993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档