首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QT qSharedDataPointer动态铸造?

QT qSharedDataPointer动态铸造?
EN

Stack Overflow用户
提问于 2021-09-02 16:51:24
回答 1查看 54关注 0票数 1

我试图执行以下强制转换,但在QT文档中或在线上都找不到一种方法来使这种动态的强制转换工作变得令人困惑:

代码语言:javascript
复制
class Entity : public QSharedData
{
  public:
    typedef QExplicitlySharedDataPointer<Entity> Pointer;
    typedef QExplicitlySharedDataPointer<const Entity> ConstPointer;
...
}

class EntityExtended : public Entity
{
public:
    typedef QExplicitlySharedDataPointer<EntityExtended> Pointer;
    typedef QExplicitlySharedDataPointer<const EntityExtended> ConstPointer;
...
}



bool SomeClass::createEntity(const Entity::ConstPointer entity)
{
  auto extendedEntity = dynamic_cast<const EntityExtended::ConstPointer>(entity);
}

上面的内容会产生错误:

代码语言:javascript
复制
error C2680: 'const EntityExtended::ConstPointer': invalid target type for dynamic_cast
note: target type must be a pointer or reference to a defined class

我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-10 16:00:34

问题是您只能在原始指针上使用dynamic_cast。尽管QExplicitlySharedDataPointer是一个像指针一样使用的类,但它不是原始指针,因此不能在其上使用dynamic_cast

解决方案是使用QExplicitlySharedDataPointerdata()constData()方法获取原始指针,然后在原始指针上使用dynamic_cast,然后通过将原始指针传递给QExplicitlySharedDataPointer constructor将其转换回QExplicitlySharedDataPointer

代码语言:javascript
复制
bool SomeClass::createEntity(const Entity::ConstPointer entity)
{
  //Create a raw pointer to use with dynamic_cast
  const EntityExtended *rawPointer = dynamic_cast<const EntityExtended*>(entity.constData());

  //Convert the raw pointer back to a QExplicitlySharedDataPointer
  EntityExtended::ConstPointer extendedEntity = EntityExtended::ConstPointer(rawPointer);

  if(extendedEntity == nullptr){
      //*entity is not an instance of ExtendedEntity
  }
  else{
      //*entity is an instance of ExtendedEntity
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69034335

复制
相关文章

相似问题

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