来自两个抽象类的多重继承 (Qt)
Posted
技术标签:
【中文标题】来自两个抽象类的多重继承 (Qt)【英文标题】:Multiple inheritance from two abstract classes (Qt) 【发布时间】:2014-05-03 12:50:24 【问题描述】:我有我的抽象类 (A
),它描述了一次实地考察和 Qt 基类 QGraphicsItem
,它描述了用于控制项目的 Qt 函数。我想从这些类继承到它们的项目。
问题是项目列表存储在QList <QGraphicsItem *>
中,导致无法直接访问A ::
字段,也不想使用dynamic_cast
。还有什么其他选择?
重要的是该项目可能不是最终的孩子,即它可以从其他项目继承(以及通过多重继承)。
在QList <QGraphicsItem *>
中只保留从A
和QGraphicsItem
继承的元素。你有什么建议?感谢您的帮助。
UPD1: 这段代码:
QList<QGraphicsItem *> items=scene->items();
for(int i=0;i<items.size();++i)
std::cerr<<"\n"<<items.at(i)->entity::getX();
(entity
is A
) 抛出错误:
/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(); ^
【问题讨论】:
那么,您继承自两个基类,并且您需要消除成员访问的歧义?这就是为::
设计的范围运算符。
我了解有必要指定范围:instance.A::methodFromA()
或 instance.QGraphicsItem::methodFromQt ()
。但是当你尝试从列表中检索一个项目并以这种方式调用方法时,我得到一个错误,因为将返回到QGraphicsItem*
的类型,这对于A
的方法是已知的。
我不明白这个问题...这是什么意思making it impossible to access the fields A ::
-> 您也不能通过良好的设计直接访问子成员,那么这与 A 有什么关系?我不明白。或者您也指“字段”而不只是数据成员的方法?这个问题就目前而言是模糊的。我认为您想添加代码来实际演示您的问题。如果你只是问如何避免dynamic_casting,好吧,你不能,好吧,这不公平,你需要使用qobject_cast,但这并不能解决问题。
我更新了主信息,保存代码格式。
也许发布(询问)您想要实现的目标(即您想要解决的问题)更有用,因为这样我们可以尝试帮助您走上正确的道路(我们可以帮助您组织数据结构和类)。
【参考方案1】:
/home/user/works/cpp/QT/Objcts/src/mainwindow.cpp:87: 错误:'entity' 不是 'QGraphicsItem' std::cerr
您正在尝试访问一个基类,而您的实体类(奇怪地没有 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();
免责声明:我没有测试过这段代码,但我认为这个概念是有效的。
既不需要标准错误,也不需要显式索引循环。您可以根据需要使用 Qt 调试功能进行打印,并使用 foreach 遍历元素。
另外,在 Qt 世界中,“getX”并不是一个真正的通用约定。人们倾向于放弃“get”前缀以减少输入。
【讨论】:
我不能使用qobject_cast
作为QGraphicsItem
不继承自QObject
。 dynamic_cast
是可能的,但不可取。
是的,我同意。我实际上正在调查那个。我推荐 dynamic_cast。
很遗憾没有正常的解决方案。规定在运行的应用程序中不要使用dynamic_cast
。感谢您的帮助。附言让问题有点悬而未决,如果要求在一周内做不到,我会关闭。
我不确定为什么 dynamic_cast 不是一个正常的解决方案。它是为这个用例设计的。
Qt 优惠qgraphicsitem_cast
,不知道是否适用。以上是关于来自两个抽象类的多重继承 (Qt)的主要内容,如果未能解决你的问题,请参考以下文章