函数
GObjectClassInitFunc
说明 [src]
类型系统用到的回调函数,用于初始化特定类型的类。
此函数应初始化所有静态类成员。
类的初始化过程涉及
- 将父类的公共成员复制到派生类的结构。
- 对未从父类中复制过来的余下成员进行零初始化。
- 调用所有父类型和该类型的 GBaseInitFunc() 初始化程序。
- 调用该类型的 GClassInitFunc() 初始化程序。
由于派生类通过对父类的内存进行复制来进行部分初始化,因此一般的规则是 GBaseInitFunc() 和 GBaseFinalizeFunc() 应负责对由指定这些 GBaseInitFunc()/GBaseFinalizeFunc() 的类型引入的类成员进行必要的重新初始化和释放。GClassInitFunc() 仅应负责初始化静态类成员,而动态类成员(如已分配的字符串或引用计数资源)则最好由该类型的 GBaseInitFunc() 来处理,以便在派生类型的类初始化时也会对动态类成员执行适当的初始化。
这里有一个示例可能有助于了解不同类初始化程序的意图
typedef struct {
GObjectClass parent_class;
gint static_integer;
gchar *dynamic_string;
} TypeAClass;
static void
type_a_base_class_init (TypeAClass *class)
{
class->dynamic_string = g_strdup ("some string");
}
static void
type_a_base_class_finalize (TypeAClass *class)
{
g_free (class->dynamic_string);
}
static void
type_a_class_init (TypeAClass *class)
{
class->static_integer = 42;
}
typedef struct {
TypeAClass parent_class;
gfloat static_float;
GString *dynamic_gstring;
} TypeBClass;
static void
type_b_base_class_init (TypeBClass *class)
{
class->dynamic_gstring = g_string_new ("some other string");
}
static void
type_b_base_class_finalize (TypeBClass *class)
{
g_string_free (class->dynamic_gstring);
}
static void
type_b_class_init (TypeBClass *class)
{
class->static_float = 3.14159265358979323846;
}
初始化 TypeBClass 首先会导致 TypeAClass 初始化(派生类会引用其父类,参见此处的 g_type_class_ref()
)。
TypeAClass 的初始化大致包括零初始化其字段,然后调用其 GBaseInitFunc() type_a_base_class_init()
来分配其动态成员(dynamic_string),最后调用其 GClassInitFunc() type_a_class_init()
来初始化其静态成员(static_integer)。然后,TypeBClass 初始化过程的第一步是将 TypeAClass 的内容简单地内存复制到 TypeBClass 中,并对 TypeBClass 中余下的字段进行零初始化。TypeBClass 中 TypeAClass 的动态成员现在需要重新初始化,该操作通过调用具有 TypeBClass 参数的 type_a_base_class_init()
来执行。
然后,调用 TypeBClass 的 GBaseInitFunc() type_b_base_class_init()
来分配 TypeBClass 的动态成员(dynamic_gstring),最后调用 TypeBClass 的 GClassInitFunc() type_b_class_init()
来使用静态成员完成初始化过程(static_float)。
必须为 GBaseInitFunc() 函数提供对应的最终化对应项,以便在类最终化时释放已分配的资源。
参数
g_class
-
类型:
GTypeClass
要初始化的
GTypeClass
结构。数据归函数的调用方所有。 class_data
-
类型:
gpointer
通过
GTypeInfo
结构提供的class_data
成员。参数可以为 NULL
。数据归函数的调用方所有。