gpt4 book ai didi

c++ - 来自两个抽象类的多重继承(Qt)

转载 作者:太空宇宙 更新时间:2023-11-04 11:34:16 27 4
gpt4 key购买 nike

我有我的抽象类 ( A ),它描述了一次实地考察和 Qt 基类 QGraphicsItem ,它描述了用于控制项目的 Qt 函数。我想从这些类继承到它们的项目。

问题是存储在 QList <QGraphicsItem *> 中的项目列表,使得无法访问字段 A ::直接,不想使用 dynamic_cast .还有哪些选择?

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

QList <QGraphicsItem *>只保留从 A 继承的元素和 QGraphicsItem .你有什么建议?感谢您的帮助。

更新 1:这段代码:

    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();
^

最佳答案

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

您正在尝试访问一个基类,而您的实体类(没有驼峰命名的奇怪命名)没有继承它。

是的,这就是动态转换的用例,例如 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 调试功能进行打印,并使用 foreach 遍历元素。

此外,在 Qt 世界中,“getX”并不是真正的通用约定。人们倾向于放弃“get”前缀以减少输入。

关于c++ - 来自两个抽象类的多重继承(Qt),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23444648/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com