用c ++(Qt)实现内省

时间:2013-11-12 13:56:02

标签: c++ qt

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

Qt通过以下方式在c ++中实现内省:

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

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

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

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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

Qt通过在QObject中存储有关每个Q_OBJECT派生的(以及具有QMetaObject宏的信息)的信息来实现内省(阅读{{3 }})。 QMetaObjectmoc预处理器构建。

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

  1. a 显然是错误的。
  2. b 作为句子没有意义。
  3. 如果您在结尾添加子类,则
  4. c 是正确的。
  5. 有关moc的更多信息here

答案 1 :(得分:0)

正确答案是C.

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

答案 2 :(得分:0)

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

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

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

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

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