0

我是 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_classparent_class有什么区别

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

4

1 回答 1

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)。

于 2012-12-07T16:26:42.050 回答