4

我想知道是否有人可以为我澄清以下内容。我即将参加与 Qt 相关的测试,示例问题相当模糊。其中一个问题如下:

Qt 通过以下方式在 C++ 中实现自省:

一种。自动将每个类定义为 QObject。

湾。定义可以在 QObject 类中调用自身的元对象。

C。定义与每个 QObject 关联的元对象。

我知道要进行自省,您必须继承 QObject(这也实现信号和插槽),并且使用 Q_OBJECT 宏使其可以被 MOC 替换。我有一种感觉,可能是这些答案中的任何一个,但我希望有人澄清一下。我认为它是A,但我可能是错的。

任何帮助是极大的赞赏。

4

3 回答 3

2

Qt 通过将有关每个QObject派生(以及具有Q_OBJECT宏的派生类)的信息存储在QMetaObject(阅读此处)中来实现自省。由预处理器QMetaObject构建。moc

我不会认为您的 3 个选项中的任何一个都是正确的:

  1. a是明显错误的。
  2. b作为一个句子没有意义。
  3. 如果在最后添加子类, c是正确的。

这里有一些关于moc.

于 2013-11-12T14:18:17.923 回答
0

正确答案是 C。

  • 答:Qt 不会让每个类都继承自 QObject(你必须明确地这样做);
  • B:我不确定这是什么意思,但是对象不能调用自己,因为 C++ 本身没有自省,这就是为什么...
  • C:是真的。它由 Q_OBJECT 宏处理,该宏为 MOC(Qt 的元对象编译器)标记一个类,以便为该标记的类生成关联的 QMetaObject 常规 C++ 代码。每个 QObject 存储指向它自己的 QMetaObject 实例的指针和指向包含有关其类的信息的静态 QMetaObject 实例的第二个指针。
于 2013-11-12T14:17:54.170 回答
0

为了提高效率(我猜),Qt 并不Java 或 .NET 那样从公共基础派生每种类型。

QObject 暴露了 QMetaObject,这确实允许大量的反射编程,但最基本的元编程工具是QMetaType

事实上,一些经常使用的类,如 QPen 或 QSize,它们是“根”对象,即根本不派生自任何东西,或者您自己的类,可以通过宏 Q_DECLARE_METATYPE 用于元编程。

目的是使QVariant可以 构造和复制通用对象。然后,由于(在系统级别)定义了属性交换或方法调用,使用 QVariant,可以很好地使用这些对象。

这是一个“混合”、高效的架构,有时需要将接口硬编码为文字。通用接口可用,但仅适用于二进制数据。再次,为了效率。

于 2013-11-12T14:20:57.660 回答