2014-09-16 4 views
0

Как создать новый тип с помощью GLib?GLib создать новый тип

Я создал эту программу:

struct stock_element { 
    GType type; 
    GtkTreeIter *iter; 
    GtkListStore *model; 
}; 
int main(int argc, char **argv) 
{ 
    GType a =g_type_register_static_simple (G_TYPE_OBJECT, 
          "type_select_item", 
          sizeof(GTypeClass) + sizeof(GObject), 
          NULL, 
          sizeof(struct stock_element), 
          NULL, 
          0); 
    } 

Но я получил это предупреждение: GLib-GObject-WARNING **: указанный размер класса для типа «type_select_item» меньше, чем размер класса родительского типа в «GObject»

+1

Вы пытаетесь создать подкласс GOb ек? В этом случае вы должны посмотреть на макросы G_DEFINE_TYPE *, которые регистрируют тип для вас. Ваш пример на самом деле не имеет смысла для меня ... – jku

ответ

-3

Я нашел решение: type_select_item = g_type_register_static_simple (G_TYPE_OBJECT, "type_select_item", SizeOf (GTypeClass) + SizeOf (GObjectClass), NULL, то SizeOf (структура ул ock_element), NULL, 0);

+2

Вам не нужно использовать 'g_type_register_static_simple'; вместо этого используйте 'G_DEFINE_TYPE (type_select_item, TypeSelectItem, G_TYPE_OBJECT)', как предлагает jku. – ptomato

1

Если вы настаиваете на использовании g_type_register_static_simple, по крайней мере, используйте его правильно.

Необходимо определить две разные структуры: класс и экземпляр. Это фундаментальные концепции любой объектно-ориентированной реализации, о которой я знаю, они не относятся к GTK +.

Если вы наследуете GObject, вы должны использовать использовать это как первое поле в своих структурах. Не знаете, где вы получили идею использования GType.

struct StockElementClass { 
    GObjectClass gobject_class; 
}; 

struct StockElement { 
    GObject gobject; 
    GtkTreeIter *iter; 
    GtkListStore *model; 
}; 

Только в этом случае вы можете зарегистрироваться и зарегистрироваться.

GType a = g_type_register_static_simple(G_TYPE_OBJECT, 
             "StockElement", 
             sizeof(struct StockElementClass), 
             NULL, 
             sizeof(struct StockElement), 
             NULL, 
             0); 

Тот факт, что ваш код работает только совпадение, потому что вы предоставили достаточно места для выделения структур класса и экземпляра. Следующий (неправильно) код работает из-за того же совпадения:

g_type_register_static_simple(G_TYPE_OBJECT, "StockElement", 
           1234, NULL, 1234, NULL, 0); 
Смежные вопросы