原創|其它|編輯:郝浩|2009-11-24 10:06:55.000|閱讀 648 次
概述:前面定義了幾個結構,我們可以把那些東西放在一個jc_boy.h文件中,下面開始介紹如何去實現這個BOY類,也就是要放在jc_boy.c中的部分。對于GObject而言,有了實例結構,有了類結構,自然要有如何初始化的函式,畢竟這是C語言嗎,沒有那么方便的事兒。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
Part 4
接上文.
前面定義了幾個結構,我們可以把那些東西放在一個jc_boy.h文件中,下面開始介紹如何去實現這個BOY類,也就是要放在jc_boy.c中的部分。
對于GObject而言,有了實例結構,有了類結構,自然要有如何初始化的函式,畢竟這是C語言嗎,沒有那么方便的事兒。
相應的,對應于jc_boy,要定義jc_boy_init和jc_boy_class_init兩個函式,當然他們分別對應于實例結構和類結構的初始化。
static用于聲明作用域,對于由多個文件構成的工程而言,很有必要。
看到JC_BOY_GET_PRIVATE了吧,就是前面的那個宏定義,它調用的是G_TYPE_INSTANCE_GET_PRIVATE,一看全都是大寫和下劃線,直覺告訴我們這還是宏定義,沒錯,它調用的是g_type_instance_get_private。 有時感覺這么折騰幾下會很麻煩,但GObject就是建議大家這么用,如果你不想使用那么一堆宏定義,那么直接使用g_type_instance_get_private之類的函式也是可以的。
JC_BOY_GET_PRIVATE獲取了一個指向實例私有結構體的一個指針,接下來就是對其初始化了,注意g_strdup在堆上分配了一個字符串,在后面介紹的類的析構的時候,我們應該將其free一下。
P.S.你可以把這里的init理解為construtor,也可以不這樣理解,因為GObject的類中提供了construtor函式,你可以在你定義的類中重寫它。但是一般簡單的應用直接在初始化函式中處理了。
下面再看下類結構的初始化
不要多看,多看會更頭暈,但這并不影響我們使用GObject來構建對象【什么?你非要弄明白?那別看本文了,本文標題寫著入門倆字呢!。。。。。。其實主要原因是自己也沒有完全研究透。。。。。。XD】 但是要明白這里向系統聲明了init ,finalize等等函式。 為了簡化這些步驟,GObject里面為我們提供了一些簡化宏定義。 這里介紹一個比較簡單的 G_DEFINE_TYPE (JcBoy , jc_boy , G_TYPE_OBJECT) ; 前兩個函式主要用于宏展開,最后一個用于表明父類的類型【對于繼承下來的類,最后一個參數可別用錯】
jc_boy_class_init (JcBoyClass *klass)
{
g_type_class_add_private (klass, sizeof (JcBoyPrivate));
klass->play=play;
}首先將實例中的私有結構在類結構中聲明下,這里用的是g_type_class_add_private.這里就沒有使用宏定義。
然后將類結構中的那個函式指向一個函式,
如
void play()
{
g_print(“the boy is playing football !\n”);
}
但有結構的初始化函式,還需要向GObject系統注冊這個類【就是注冊有這么一個類型】。
類的注冊其實是比較麻煩的,這要用到g_type_register_***,可以注冊成fundamental的,static的,dynamic的,一般的應用基本用的都是static的,也是本文要講述的【主要是自己還沒怎么研究dynamic的緣故……XD】
以g_type_register_static為例
g_type_register_static( parent_type,
const *type_name,
const *info,
flags);
看英文大概能明白每個參數是干嘛的,這里面比較麻煩的是GTypeInfo,還是簡單看下
Code
還是展開看一下,其實還是比較麻煩的,具體我就不多說了。
Code
另外,為了方便設置類中的成員還要設置幾個可以由外部調用的的函式。
void jc_boy_change_hobby(JcBoy *self,gchar *hobby)
{
JcBoyPrivate *priv;
self->priv = priv = JC_BOY_GET_PRIVATE(self);
g_free (priv->hobby);
priv->hobby=g_strdup("playing basketball");
g_print("recently the boy is interested in %s\n",hobby);
}
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園