在Gobject中获取父类

时间:2012-10-30 15:56:55

标签: glib gobject

我是GObject的新手。我对获取指向一个类的父的指针感到困惑。例如, 在Gobject Spec上,我们有一个类:

struct _MamanBarClass {
  GObjectClass parent;

  /* class members */
};

有什么区别:

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

MamanBarClass klass;
GObjectClass g_object_class=G_OBJECT_CLASS(klass);

g_object_class parent_class

之间有什么区别

还有一个问题: 施放 MamanBarClass(klass) MAMANBARCLASS(klass)之间的区别 谢谢!

1 个答案:

答案 0 :(得分:2)

在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 *) klassMAMAN_BAR_CLASS(klass)是等价的,但后者执行运行时类型检查(如果klass不是MamanBarClass *,则发出g_critical)。