两个抽象类(Qt)的多重继承

时间:2014-05-03 12:50:25

标签: c++ qt qtgui qgraphicsitem dynamic-cast

我有我的抽象类(A),它描述了一个字段旅行和Qt基类QGraphicsItem,它描述了用于控制项目的Qt函数。我想从这些类继承他们的项目。

问题在于QList <QGraphicsItem *>中存储的项目列表,无法直接访问字段A ::,也不想使用dynamic_cast。还有什么其他选择?

重要的是该项目可能不是最终的子项,即它可以从其他项目继承(以及通过多重继承)。

仅在QList <QGraphicsItem *>中保留从AQGraphicsItem继承的元素。你有什么建议?谢谢你的帮助。

UPD1: 这段代码:

    QList<QGraphicsItem *> items=scene->items();
    for(int i=0;i<items.size();++i){
        std::cerr<<"\n"<<items.at(i)->entity::getX();
    }

entityA)抛出错误:

  

/home/user/works/cpp/QT/Objcts/src/mainwindow.cpp:87: error: 'entity' is not a base of 'QGraphicsItem' std::cerr<<"\n"<<items.at(i)->entity::getX(); ^

1 个答案:

答案 0 :(得分:1)

  

/home/user/works/cpp/QT/Objcts/src/mainwindow.cpp:87:错误:'entity'不是'QGraphicsItem'的基础std :: cerr&lt;&lt;“\ n”&lt;实体::的getX();

您正在尝试访问基类,而您的实体类(奇怪地没有CamelCase命名)不会继承它。

是的,所以这就是动态强制转换的用例,就像C ++中的dynamic_cast一样。你应该利用它。

话虽如此,对于QObjects,最好在Qt世界中使用qobject_cast而不是原始dynamic_cast。 QGraphicsItem故意不是QObject,虽然你的其他基础(实体)可能是,但这不相关。

这段代码可以帮到你:

QList<QGraphicsItem *> items = scene->items();
foreach (GraphicsItem* item, items) {
    entity *e = dynamic_cast<entity*>(item);
    if (e)
        qDebug() << e->getX();
}

免责声明:我没有测试过这段代码,但我认为这个概念是有效的。

既不需要stderr,也不需要显式的索引循环。您可以使用Qt调试功能按照您的意愿进行打印,并预先浏览元素。

此外,在Qt世界中,“getX”并不是一个普通的惯例。人们倾向于放弃“获取”前缀,而不是打字。

相关问题