Glib 在Gobject中获取父类

Glib 在Gobject中获取父类,glib,gobject,Glib,Gobject,我是GObject的新手。我把指针指向一个班的父亲弄糊涂了。例如, 在Gobject规范中,我们有一个类: struct _MamanBarClass { GObjectClass parent; /* class members */ }; 以下两者之间的区别是什么: MamanBarClass klass; GObjectClass parent_class=G_OBJECT_CLASS(g_type_class_peek_parent (klass)); 及 g_object

我是GObject的新手。我把指针指向一个班的父亲弄糊涂了。例如, 在Gobject规范中,我们有一个类:

struct _MamanBarClass {
  GObjectClass parent;

  /* class members */
};
以下两者之间的区别是什么:

MamanBarClass klass;
GObjectClass parent_class=G_OBJECT_CLASS(g_type_class_peek_parent (klass));

g_object_classparent_class

还有一个问题: 铸造MamanBarClass(klass)MamanBarClass(klass)
谢谢大家!

在GObject中,任何新类型都会在寄存器中保留一个类结构,以保存运行时信息、虚拟方法和私有类数据

强制转换(
G_OBJECT_CLASS(klass)
)用于检索klass的GObjectClass,而
G_OBJECT_CLASS(G_type_CLASS_peek_parent(klass))
返回klass的父对象的的GObjectClass。在您的示例中,前者仅返回MamanBarClass的GObjectClass结构,而后者返回在寄存器中找到的GObjectClass结构(MamanBarClass的父级)的GObjectClass结构。实际上:

klass = G_OBJECT_CLASS(maman_bar_class);
/* This will override MamanBar::dispose */
klass->dispose = my_dispose;
/* Now my_dispose will be called by g_object_dispose(object) when object is a MamanBar object */

klass = G_OBJECT_CLASS(g_type_class_peek_parent(klass));
/* This will override GObject::dispose */
klass->dispose = my_dispose
/* Now my_dispose will be called by g_object_dispose(object) when object is a GObject (the parent class of MamanBar) object */

(MamanBarClass*)klass
MamanBar_类(klass)
是等效的,但后者执行运行时类型检查(如果klass不是MamanBarClass*,则发出g_临界值)。

后者仅在使用的GLib副本是在调试模式下编译的情况下执行运行时检查;请参阅本页的“额外配置选项”部分:
klass = G_OBJECT_CLASS(maman_bar_class);
/* This will override MamanBar::dispose */
klass->dispose = my_dispose;
/* Now my_dispose will be called by g_object_dispose(object) when object is a MamanBar object */

klass = G_OBJECT_CLASS(g_type_class_peek_parent(klass));
/* This will override GObject::dispose */
klass->dispose = my_dispose
/* Now my_dispose will be called by g_object_dispose(object) when object is a GObject (the parent class of MamanBar) object */