Введение

Тип, которым манипулирует система типов 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?