【问题标题】:gtk _get_type() function implementationgtk _get_type() 函数实现
【发布时间】:2013-12-31 18:50:33
【问题描述】:
我刚开始学习 GTK。我正在浏览 gtk+3.0.0 的源代码,我发现了一些 gtk 对象类型的 _get_type() 方法的实现,但有些没有这个方法的实现,例如GtkRange。这有什么原因吗?据我从 GObject 参考手册中了解到,_get_type() 方法在类型系统中注册对象类型。
【问题讨论】:
标签:
gtk
glib
gtk3
gobject
【解决方案1】:
所有注册为 GType 的类型都需要 get_type() 函数。 GObject(库)提供了方便的宏来生成正确的get_type() 函数实现,同时考虑到线程安全初始化或动态类型注册等因素。
用于GObject(类型)子类的宏是G_DEFINE_TYPE(),但在GTK+中你也会发现G_DEFINE_TYPE_WITH_CODE(),一般在类型也实现接口时使用; G_DEFINE_ABSTRACT_TYPE() 和 G_DEFINE_ABSTRACT_TYPE_WITH_CODE(),用于抽象类型;最近还有G_DEFINE_TYPE_WITH_PRIVATE() 和G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE(),它们使用私有数据定义GObject 子类,避免在类初始化函数中调用g_type_class_add_private()。
盒装类型(Plain Old Structures 周围的 GType 包装器)也有 G_DEFINE_BOXED_TYPE(),接口类型有 G_DEFINE_INTERFACE()。
更多信息请参见 GObject 的 API 参考:
https://developer.gnome.org/gobject/stable/gobject-Type-Information.html#G-DEFINE-TYPE:CAPS