Введение
Тип, которым манипулирует система типов Glib, намного более общий, чем тот который обычно подразумевается как объектный тип (Object type). Это лучше всего демонстрирует ниже показанная структура и функции используемые для регистрации типа в системе типов.
typedef struct _GTypeInfo GTypeInfo;
struct _GTypeInfo
{
/* interface types, classed types, instantiated types */
guint16 class_size;
GBaseInitFunc base_init;
GBaseFinalizeFunc base_finalize;
/* classed types, instantiated types */
GClassInitFunc class_init;
GClassFinalizeFunc class_finalize;
gconstpointer class_data;
/* instantiated types */
guint16 instance_size;
guint16 n_preallocs;
GInstanceInitFunc instance_init;
/* value handling */
const GTypeValueTable *value_table;
};
GType g_type_register_static (GType parent_type,
const gchar *type_name,
const GTypeInfo *info,
GTypeFlags flags);
GType g_type_register_fundamental (GType type_id,
const gchar *type_name,
const GTypeInfo *info,
const GTypeFundamentalInfo *finfo,
GTypeFlags flags);g_type_register_static и g_type_register_fundamental являются C функциями, определёнными в gtype.h и реализованными в gtype.c которые вы должны использовать для регистрации новых GType в программной системе типов. Маловероятно что вам потребуется использовать g_type_register_fundamental (вы должны бить Tim Janik, чтобы делать это) но если вам это нужно, последний раздел разъясняет как создаются новые базовые типы данных. [2]
Базовые типы данных являются высшим уровнем типов которые не происходят от других типов в то время как обычные типы происходят из других типов. После инициализации g_type_init, система типов не только инициализирует внутренние сструктуры данных, но и регистрирует множество основных типов: некоторые из них являются базовыми типами данных. Остальные являются типами полученными из этих базовых типов.
Базовые и небазовые типы данных определяют:
размер класса: поле class_size в GTypeInfo.
функции инициализации класса (C++ конструктор): поля base_init и class_init в GTypeInfo.
функции уничтожения класса (C++ деструктор): поля base_finalize и class_finalize в GTypeInfo.
размер экземпляра (C++ параметр нового): поле instance_size в GTypeInfo.
instanciation policy (C++ тип нового оператора): поле n_preallocs в GTypeInfo.
функции копирования (C++ операторы копирования): поле value_table в GTypeInfo.
флаги характеризующие тип: GTypeFlags.
Базовые типы данных определяются так же набором GTypeFundamentalFlags которые хранятся в GTypeFundamentalInfo. Небазовые типы кроме всего прочего определяются их родителем, который помещается как параметр parent_type вg_type_register_static и g_type_register_dynamic.
Last updated
Was this helpful?