函数

GObjectClassInitFunc

声明

void
(* GClassInitFunc) (
  GObjectTypeClass* g_class,
  gpointer class_data
)

说明 [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
数据归函数的调用方所有。