方法

GObjectTypeClassadd_private

已弃用:2.58 自:2.4

声明 [源代码]

void
g_type_class_add_private (
  GObjectTypeClass* g_class,
  gsize private_size
)

描述 [源代码]

为可实例化的类型注册一个私有结构体。

当一个对象被分配时,该类型及其所有父类型的私有结构体会连续地分配在公共结构的同一内存块中,并且会被零填充。

请注意,一个类型的私有结构及其所有父类型的累积大小不能超过64 KiB。

应该在类型的 class_init() 函数中调用此函数。可以使用 G_TYPE_INSTANCE_GET_PRIVATE() 宏检索私有结构体。

以下示例展示了在类型的 class_init() 函数中将私有结构体 MyObjectPrivate 吊接到在标准 GObject 方式定义的对象 MyObject 上。

请注意使用结构体成员“priv”以避免多次调用 MY_OBJECT_GET_PRIVATE() 产生的开销。

typedef struct _MyObject        MyObject;
typedef struct _MyObjectPrivate MyObjectPrivate;

struct _MyObject {
 GObject parent;

 MyObjectPrivate *priv;
};

struct _MyObjectPrivate {
  int some_field;
};

static void
my_object_class_init (MyObjectClass *klass)
{
  g_type_class_add_private (klass, sizeof (MyObjectPrivate));
}

static void
my_object_init (MyObject *my_object)
{
  my_object->priv = G_TYPE_INSTANCE_GET_PRIVATE (my_object,
                                                 MY_TYPE_OBJECT,
                                                 MyObjectPrivate);
  // my_object->priv->some_field will be automatically initialised to 0
}

static int
my_object_get_some_field (MyObject *my_object)
{
  MyObjectPrivate *priv;

  g_return_val_if_fail (MY_IS_OBJECT (my_object), 0);

  priv = my_object->priv;

  return priv->some_field;
}

自 2.4 起可用

自 2.58 起已弃用

使用 G_ADD_PRIVATE() 宏与 G_DEFINE_* 系列宏一起使用,可以向类型添加实例私有数据。

参数

private_size

类型: gsize

私有结构体的尺寸。