Справочное описание GObject |
---|
Многие типы неиснстанциированы системой типов и не имеют класса.
Большинство таких типов являются тривиальными базовыми типами такие как gchar,
регистрируются g_value_types_init
(в gvaluetypes.c
).
Для регистрации таких типов в системе типов, вам нужно просто заполнить структуру GTypeInfo нулями, так как эти типы базовые:
GTypeInfo info = {
0, /* class_size */
NULL, /* base_init */
NULL, /* base_destroy */
NULL, /* class_init */
NULL, /* class_destroy */
NULL, /* class_data */
0, /* instance_size */
0, /* n_preallocs */
NULL, /* instance_init */
NULL, /* value_table */
};
static const GTypeValueTable value_table = {
value_init_long0, /* value_init */
NULL, /* value_free */
value_copy_long0, /* value_copy */
NULL, /* value_peek_pointer */
"i", /* collect_format */
value_collect_int, /* collect_value */
"p", /* lcopy_format */
value_lcopy_char, /* lcopy_value */
};
info.value_table = &value_table;
type = g_type_register_fundamental (G_TYPE_CHAR, "gchar", &info, &finfo, 0);
Наличие неинстанциированных типов может показаться немного бесполезным: что хорошего в типе если вы не можете инстанциировать экземпляр этого типа? Большинство этих типов используются вместе с GValues: GValue инициализируется целочисленным или строкой и размещается используя value_table зарегистрированного типа. GValues (и расширение тривиального базового типа) полезна когда используется вместе со свойствами объекта и сигналами.