2013-03-21 2 views
1

В настоящее время я пытаюсь узнать, как использовать GObject, и есть точка, которую я абсолютно не понимаю: в чем разница между классом и структурой экземпляра (например, «MamanBarClass» и «MamanBar») соответственно. как их использовать?
На данный момент я поместил все атрибуты объекта в частную структуру (например, «MamanBarPrivate»), зарегистрируйте его с помощью «g_type_class_add_private» и определите свойства/получатели/сеттеры для доступа к ним. Но когда я оставляю структуру класса пустой я получаю следующее сообщение об ошибке в «g_type_register_static_simple»:разница между классом и структурой экземпляра

specified class size for type `MamanBar' is smaller than `GTypeClass' size 

И почему все методы объекта определяется в классовой структуре (например, «GtKWidgetClass»)? Возможно, я просто завинчивания все, но я работал только с Delphi для объектно-ориентированного программирования еще (я знаю, ничего не будет гордиться: D)

С уважением

ответ

2

В настоящее время я пытаюсь научиться используйте GObject, и есть точка, которую я абсолютно не понимаю: в чем разница между классом и структурой экземпляра (например, «MamanBarClass» и «MamanBar») соответственно. как их использовать?

Структура класса создается только один раз и не зависит от экземпляра. Здесь вы помещаете вещи, которые не являются специфичными для экземпляра, например указатели на виртуальные методы (что наиболее часто используется для структуры класса).

На данный момент я бы поставил все мои атрибуты объекта в частную структуру (например, «MamanBarPrivate»), зарегистрировать его «g_type_class_add_private» и определить свойства/добытчиками/сеттеры для доступа к ним.

Хорошо. Это правильная вещь.

Но когда я оставляю структуру класса пустой я получаю следующее сообщение об ошибке в «g_type_register_static_simple»:

Вы никогда не должны покидать структуру класса пустой. Он всегда должен содержать структуру класса для типа, на который вы наследуете. Например, если вы пытаетесь создать GObject, классовая структура должна выглядеть следующим образом (как минимум):

struct _MamanBarClass { 
    GObjectClass parent_class; 
}; 

Даже если вы не унаследованный от GObject, вы по-прежнему нужен базовый класс для GType:

struct _FooClass { 
    GTypeClass parent_class; 
}; 

Это how simple inheritance is done in C.

И почему все объектные методы определены в структуре классов (например, «GtKWidgetClass»)? Возможно, я просто завинчивания все, но я только не работал с Delphi для объектно-ориентированного программирования еще (я знаю, ничего, чтобы гордиться о: D)

Те virtual public methods. Что касается того, почему они определены в структуре класса вместо структуры экземпляра, это потому, что реализации одинаковы для каждого экземпляра.

+1

Спасибо, чувак, я не понял, что для моей структуры классов требуется структура класса, наследовавшая меня, а не только ** указатель ** на нее. Таким образом, наследование имеет смысл! –

Смежные вопросы