原創|其它|編輯:郝浩|2009-11-24 10:05:48.000|閱讀 686 次
概述:終于要談正題了,如何使用GObject去構件一個所謂的“對象”呢?其實是一件簡單但卻痛苦的事情。在羅列代碼之前,還是要啰嗦兩句。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
Part 3
終于要談正題了,如何使用GObject去構件一個所謂的“對象”呢?其實是一件簡單但卻痛苦的事情。
在羅列代碼之前,還是要啰嗦兩句。
GObject中每個類要定義兩個結構體,假設你要定義的類型為People,那么你要定義兩個結構分別名為People和PeopleClass,估計 剛接觸的人會有些暈,一般的C++啊,JAVA什么的都是直接一個class了事兒了。但記住C本身并沒有面向對象的機制,這里這樣做也僅僅是為了模擬。 名為PeopleClass的結構是表示類的結構,而名為People的結構則是這個類的實例,可能這么說一般人還會有點摸不著頭腦,切記,這是一種模 擬。
在GObject中一個對象的產生遵循如下原則,
如果產生的是該類的第一個實例,那么先分配Class結構,在分配針對該實例的結構。否則直接分配針對該實例的結構。
也就是說在Class結構中所有的內容,是通過該類生成的實例所公有的。而實例獲每個對象時,為其單獨分配專門的實例用結構。
下面要看些代碼了,也以為著領略下GObject令人痛苦的地方,
先看一段宏定義,也是用GObject定義對象所必須的,
其中JC為域,換成別的什么都成,只是一個我個人所使用的縮寫,正如GTK這三個字母一般,而實際要定義的就是一個BOY,具體每個宏是干什么的都寫了簡單的注釋。
P.S.基本上都是 域_類名_***的結構,也就是JC_BOY_***,如果每次都自己寫還是很麻煩的,所以用GObject基本上copy的次數會很多。
定義了這么一堆東西該怎么用,簡單說一下,比如實例類型轉換時,要將一個繼承自BOY的對象man轉換成BOY就可以使用JC_BOY(man),還是那句話,重在理解。
下面開始定義前面所說的幾個結構
可以看到每個結構中的第一項描述的是其父類相關的結構,這是為了模擬繼承的機制,而所謂的public和private則只能靠程序員自己理解了。另外,比較好的生命方式是在實例結構中定義一個名為private的指針,指向專門結構體。
如下,
typedef struct _JcBoyPrivate JcBoyPrivate;
struct _JcBoyPrivate
{
gchar *name;
guint age;
gchar *hobby;
};
P.S. 假設男孩兒類具有名字,年齡,愛好三個成員,且名字和愛好在類生成時在堆中動態分配。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園