类和实例结构之间的区别

时间:2013-03-21 15:52:49

标签: gobject

我目前正在尝试学习如何使用GObject,并且有一点我绝对不明白:类和实例结构之间有什么区别(比如“MamanBarClass”“MamanBar”)resp。我该如何使用它们?
目前我将所有对象属性放入私有结构(如“MamanBarPrivate”),将其注册为“g_type_class_add_private”并定义属性/ getters / setter以访问它们。但是当我将类结构留空时,我在“g_type_register_static_simple”中收到以下错误:

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

为什么在类结构中定义了所有对象方法(比如“GtKWidgetClass”)?可能我只是搞砸了所有东西,但我只和Delphi合作过OOP(我知道,没有什么值得骄傲的:D)

此致

1 个答案:

答案 0 :(得分:3)

  

我目前正在尝试学习如何使用GObject,并且有一点我绝对不明白:类和实例结构(如“MamanBarClass”和“MamanBar”)之间有什么区别。我该如何使用它们?

类结构只创建一次,并不是特定于实例的。这是你放置非特定于实例的东西的地方,比如虚拟方法的指针(这是类结构最常用的)。

  

目前我将所有对象属性放入私有结构(如“MamanBarPrivate”),将其注册为“g_type_class_add_private”并定义属性/ getter / setter以访问它们。

好。这是正确的做法。

  

但是当我将类结构留空时,我在“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合作过OOP(我知道,没有什么值得骄傲的:D)

那些是virtual public methods。至于为什么它们是在类结构而不是实例结构中定义的,这是因为每个实例的实现都是相同的。