GObject [3] 子类对象私有属性的模拟-隐藏

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中具体定义

参考

  • 对象属性:表示属于实例结构体的属性,文档中讲了怎么隐藏
  • 类属性:表示属于类结构体的属性,可以被所有的对象共享,文档中讲了怎么通过类属性来访问对象属性。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值