我目前正在尝试学习如何使用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)
此致
答案 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。至于为什么它们是在类结构而不是实例结构中定义的,这是因为每个实例的实现都是相同的。