一、GObject学习笔记-前言
1 GObject学习经历
我的GObject系统性学习可以分为两次
-
第一次是学习参考的是 http://garfileo.is-programmer.com/categories/6934/posts,这部分学习笔记分类名称是
GObject学习笔记202109
,相关文件在 /assets/GObjectStudy/202109/。该参考文章编写于2012年,现在许多Glib库已经更新了许多内容,而且以链表为例,不便于学习。 -
第二次学习参考的是 https://github.com/ToshioCP/Gobject-tutorial/tree/main,这部分笔记的分类名称是
GObject学习笔记
,这是目前主要的GObject学习笔记分类,相关文件在 /assets/GObjectStudy/202311/。
2 第二次学习GObject
-
二、GObject:讲述了基本的GObject对象,分为类结构体和实例结构体。
g_object_new
、g_object_ref
、g_object_unref
等函数创建对象,引用计数。 -
-
g_type_register_static
注册一个静态对象类型。(这是G_DEFINE_TYPE
宏展开的主要函数,该宏用的是g_type_register_static_simple
函数)。第五节 注册讲述了如何手动注册一个静态对象类型。 -
G_DEFINE_TYPE
和G_DECLARE_FINAL_TYPE
宏展开内容以及作用。
-
-
四、信号:讲述了如何注册信号。
-
五、属性:讲述了如何注册属性。
-
六、可派生和抽象类型:这个可派生是声明型宏
G_DECLARE_DERIVABLE_TYPE
声明了一下特性,告诉我们这个对象是可派生,也就是可继承的。声明型宏还有G_DECLARE_FINAL_TYPE
。定义型宏有G_DEFINE_TYPE
、G_DEFINE_ABSTRACT_TYPE
和G_DEFINE_FINAL_TYPE
。-
这篇文章使用了
G_DECLARE_DERIVABLE_TYPE
可继承型Declare宏和G_DEFINE_ABSTRACT_TYPE
抽象类Define宏,编写一个抽象类型对象TNumber
。 -
继承
TNumber
,使用G_DECLARE_FINAL_TYPE
和G_DEFINE_TYPE
编写了TInt
和TDouble
(其实可以使用G_DEFINE_FINAL_TYPE
)。涉及到了虚函数重写,其实就是抽象类成员函数指针。TInt
和TDouble
都重写了父类TNumber
的类成员函数指针(自己编写了一个函数,把该函数的指针赋值给父类成员函数指针,由此实现了多态)。
-
-
七、可派生和非抽象类型:使用
G_DECLARE_DERIVABLE_TYPE
和G_DEFINE_TYPE_WITH_PRIVATE
宏,编写了TStr
对象。使用该带有私有结构体定义型宏:-
为了
TStr
有私有域,而且不对子类Public。 -
TStr
可以被实例化。
-
-
八、子类扩展父类的功能:使用
G_DECLARE_FINAL_TYPE (TNumStr, t_num_str, T, NUM_STR, TStr)
和G_DEFINE_TYPE(TNumStr, t_num_str, T_TYPE_STR)
继承上一节的TStr
对象,编写了数字字符串TNumStr
对象。GObject ╰──TNumber # 抽象可继承类型 ╰──TInt # 最终型对象,可以添加接口TComparable ╰──TDouble # 最终型对象,可以添加接口TComparable (不可继承对象) GObject ╰──TStr # 非抽象可继承类型,可以添加接口TComparable ╰──TNumStr # 最终型对象(不可继承对象)
-
九、接口:接口可以被任何对象添加到实例结构体中,实现接口的虚函数,这样所有对象都可以实现多态,不一定要同一个基类。接口的声明和定义用到
G_DECLARE_INTERFACE
和G_DEFINE_INTERFACE
宏。子对象实现接口的时候用到G_IMPLEMENT_INTERFACE
宏。 -
总结了几种
G_DFINE_XX
型宏和G_DECLARE_XX
型宏的具体作用和区别:-
G_DEFINE_TYPE
、G_DEFINE_ABSTRACT_TYPE
和G_DEFINE_FINAL_TYPE
主要区别就是类型注册函数flag参数的不同,抽象类型不能被实例化,只能被继承;最终型不能被继承 -
G_DECLARE_DERIVABLE_TYPE
和G_DECLARE_FINAL_TYPE
主要区别就是定义类和实例结构体不同
/* G_DECLARE_DERIVABLE_TYPE (TDouble, t_double, T, DOUBLE, GObject) */ typedef struct _TDouble TDouble; typedef struct _TDoubleClass TDoubleClass; struct _TDouble { GObject parent_instance; }; /* G_DECLARE_FINAL_TYPE (TDouble, t_double, T, DOUBLE, GObject) */ typedef struct _TDouble TDouble; typedef struct { GObjectClass parent_class; } TDoubleClass;
-