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 合作过 OOP(我知道,没有什么值得骄傲的 :D)

问候

4

1 回答 1

4

我目前正在尝试学习如何使用 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;
};

这就是在 C 中完成简单继承的方式

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

这些是虚拟公共方法。至于为什么在类结构而不是实例结构中定义它们,这是因为每个实例的实现都是相同的。

于 2013-03-21T19:20:17.313 回答