QT qSharedDataPointer динамическое приведение?

Я пытаюсь выполнить следующее приведение, и я не могу найти способ ни в документации QT, ни в Интернете, чтобы сделать это динамическое приведение, которое сбивает с толку:

      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);
}

Вышеуказанное вызывает ошибку:

      error C2680: 'const EntityExtended::ConstPointer': invalid target type for dynamic_cast
note: target type must be a pointer or reference to a defined class

Что мне не хватает?

1 ответ

Проблема в том, что вы можете использовать только необработанные указатели. Несмотря на то, что это класс, предназначенный для использования в качестве указателя, это не необработанный указатель, поэтому вы не можете использовать его.

Решение состоит в том, чтобы получить необработанный указатель, используя 'data()илиconstData()методы и использоватьdynamic_castвместо этого на необработанный указатель. Затем вы можете преобразовать его обратно в a, передав необработанный указатель наQExplicitlySharedDataPointerконструктор :

      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
  }
}
Другие вопросы по тегам