GObject 和 QObject 都使用到了 metadata ,所谓的 metadata 就是一个类的 “元属性” ,直白点说就是 “描述这个类的相关属性”,这些属性是本类的固有特性,不因为类实例的不同的改变,从编程的角度来看,类似于 “类的static属性”,不同的地方在于,metadata基本上都是固定不变的一些值,而 static属性大多是可以变化的。
GObject是如何实现的?
描述一个 GObject类 需要两个 struct ,一个叫 类结构体,一个叫 对象结构体,类结构体内存放 metadata,对象结构体内存放 成员变量。
Glib 把 类结构体定义在 源文件中,这样外部就无法正常访问了,除非使用者 include c文件,一般人都不会这样做。对象结构体内包含成员变量,放在 h 文件中,同时对象结构体中有一个类结构体类型的指针,通过此指针可以访问属于类的 metadata。
QObject中的实现
Qt 中只要看到 xxxPriv 命名规则的 class 或者指针类型,都是metadata。