1. 程式人生 > >GObject [3] 子類物件私有屬性的模擬-隱藏

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中具體定義

參考

  • 物件屬性:表示屬於例項結構體的屬性,文件中講了怎麼隱藏
  • 類屬性:表示屬於類結構體的屬性,可以被所有的物件共享,文件中講了怎麼通過類屬性來訪問物件屬性。