我是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)之间的区别 谢谢!
答案 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 *) klass
和MAMAN_BAR_CLASS(klass)
是等价的,但后者执行运行时类型检查(如果klass不是MamanBarClass *,则发出g_critical)。