1、隐藏什么,为什么要隐藏?
隐藏的就是非类类型数据,也就是不是我们要封装成类的数据。
隐藏以后就简化了.h文件,.c文件复杂了,使用类的人当然是希望他要看到的.h文件越简单越好。而.c这部分代码通常是第三方并不关注的。
2、如何隐藏?
方法很多,这里写出两种。
第一种,很简单,加上注释 /*private*/ 和/*public*/
第二种,将上一篇的例子进行隐藏以后的结果如下:
hw-dlist.h
#ifndef HWDLIST_H
#define HWDLIST_H
#include <glib-object.h>
#define HW_TYPE_DLIST (hw_dlist_get_type());
typedef struce _HWDList HWDlist;
struct _HWDList { //实例结构体
GObject parent_instance; //这里的GObject 是GObject的实例结构体
};
typedef struce _HWDListClass HWDListClass; //类结构体
struct _HWDListClass {
GObjectClass parent_class; //这里的GObjectClass 是GObject的类结构体
};
GType hw_dlist_get_type(void);
#endif
hw-dlist.c
#include "hw-dlist.h"
// 以下这个宏相当于hw_dlist_get_type()函数,
G_DEFINE_TYPE (HWDlist, hw_dlist, G_TYPE_OBJECT);
//定义这个宏来帮助我们获取隐藏的数据
#define PM_DLIST_GET_PRIVATE(obj) ( G_TYPE_INSTANCE_GET_PRIVATE ((obj), PM_TYPE_DLIST, PMDListPrivate)) //****
// 这个扑通的机构体从.h文件移到了.c文件中
typedef struct _HWDlistNode HWDlistNode;
struct _HEDlistNode{
HWDlistNode *prev;
HWDlistNode *next;
void *data;
};
// 把实力结构体中的非类数据拿出来重新建立一个结构体
typedef struct _HWDlistPrivate HWDlistPrivate;
struct _HWDlistPrivate{
HWDlistNode *tail;
HWDlistNode *head;
};
static void hw_dlist_init(HWDlist *self){
// 这一行
HWDlistPrivate *priv = HW_DLIST_GET_PRIVATE(self); //***
g_printf("实例结构体初始化\n");
self -> head = NULL;
self -> tail = NULL;
}
static void hw_dlist_class_init(HWDlistClass *class){
// HWDlistPrivate 结构体添加到HWDlist对象中
g_type_class_add_private(class, sizeof(HWDlistPrivate)); //***
g_printf("类结构体初始化\n");
}
两个概念:
类和对象的方法:在.h文件中声明,在类型注册文件.c中具体定义
- 对象属性:表示属于实例结构体的属性,文档中讲了怎么隐藏
- 类属性:表示属于类结构体的属性,可以被所有的对象共享,文档中讲了怎么通过类属性来访问对象属性。