我想知道是否有人可以为我澄清以下内容。我即将参加与Qt相关的测试,样本问题相当模糊。其中一个问题如下:
Qt通过以下方式在c ++中实现内省:
一个。自动将每个类定义为QObject。
湾定义可以在QObject类中调用自身的元对象。
℃。定义与每个QObject关联的元对象。
我知道要进行内省,你必须继承QObject(这也会实现信号和插槽),并且使用Q_OBJECT宏使它可以被MOC替换。我有一种感觉,这可能是这些答案中的任何一个,但我希望有人澄清一下。我认为这是A但我可能是错的。
非常感谢任何帮助。
答案 0 :(得分:2)
Qt通过在QObject
中存储有关每个Q_OBJECT
派生的类(以及具有QMetaObject
宏的信息)的信息来实现内省(阅读{{3 }})。 QMetaObject
由moc
预处理器构建。
我不会认为你的3个选项中的任何一个都是正确的:
有关moc
的更多信息here。
答案 1 :(得分:0)
正确答案是C.
答案 2 :(得分:0)
为了提高效率(我猜),Qt 不从公共基础派生每种类型,如Java或.NET。
QObject暴露了QMetaObject,它确实允许大量的反射编程,但最基本的元编程工具是QMetaType。
实际上,一些经常使用的类,如QPen或QSize,它们是“根”对象,即根本不从任何东西派生,或者您自己的类,可以通过宏Q_DECLARE_METATYPE用于元编程。< / p>
目的是使QVariant 构建和复制通用对象。然后,由于使用QVariant定义了属性交换或方法调用(在系统级别),因此可以很好地利用这些对象。
这是一种“混合”,高效的架构,有时需要将接口硬编码为文字。通用接口是可用的,但仅适用于二进制数据。再次,为了效率。