使用C语言进行面向对象的开发--GObject入门[4]
2009-11-21 13:06
465 查看
转载请注明出处blog.csdn.net/pingf0或www.cnblogs.com/pingf
Part4
相应的,对应于jc_boy,要定义jc_boy_init和jc_boy_class_init两个函式,当然他们分别对应于实例结构和类结构的初始化。
Code
#defineG_DEFINE_TYPE(TN,t_n,T_P)G_DEFINE_TYPE_EXTENDED(TN,t_n,T_P,0,{})
#defineG_DEFINE_TYPE_EXTENDED(TN,t_n,T_P,_f_,_C_)_G_DEFINE_TYPE_EXTENDED_BEGIN(TN,t_n,T_P,_f_){_C_;}_G_DEFINE_TYPE_EXTENDED_END()
#define_G_DEFINE_TYPE_EXTENDED_BEGIN(TypeName,type_name,TYPE_PARENT,flags)\
\
staticvoidtype_name##_init(TypeName*self);\
staticvoidtype_name##_class_init(TypeName##Class*klass);\
staticgpointertype_name##_parent_class=NULL;\
staticvoidtype_name##_class_intern_init(gpointerklass)\
{\
type_name##_parent_class=g_type_class_peek_parent(klass);\
type_name##_class_init((TypeName##Class*)klass);\
}\
\
gulong\
type_name##_get_type(void)\
{\
staticvolatilegsizeg_define_type_id__volatile=0;\
if(g_once_init_enter(&g_define_type_id__volatile))\
{\
gulongg_define_type_id=\
g_type_register_static_simple(TYPE_PARENT,\
g_intern_static_string(#TypeName),\
sizeof(TypeName##Class),\
(GClassInitFunc)type_name##_class_intern_init,\
sizeof(TypeName),\
(GInstanceInitFunc)type_name##_init,\
(GTypeFlags)flags);\
{/*customcodefollows*/
#define_G_DEFINE_TYPE_EXTENDED_END()\
/*followingcustomcode*/\
}\
g_once_init_leave(&g_define_type_id__volatile,g_define_type_id);\
}\
returng_define_type_id__volatile;\
}/*closestype_name##_get_type()*/
[/code]
Part4
接上文.
前面定义了几个结构,我们可以把那些东西放在一个jc_boy.h文件中,下面开始介绍如何去实现这个BOY类,也就是要放在jc_boy.c中的部分。
对于GObject而言,有了实例结构,有了类结构,自然要有如何初始化的函式,毕竟这是C语言吗,没有那么方便的事儿。
相应的,对应于jc_boy,要定义jc_boy_init和jc_boy_class_init两个函式,当然他们分别对应于实例结构和类结构的初始化。
Code
#defineG_DEFINE_TYPE(TN,t_n,T_P)G_DEFINE_TYPE_EXTENDED(TN,t_n,T_P,0,{})
#defineG_DEFINE_TYPE_EXTENDED(TN,t_n,T_P,_f_,_C_)_G_DEFINE_TYPE_EXTENDED_BEGIN(TN,t_n,T_P,_f_){_C_;}_G_DEFINE_TYPE_EXTENDED_END()
#define_G_DEFINE_TYPE_EXTENDED_BEGIN(TypeName,type_name,TYPE_PARENT,flags)\
\
staticvoidtype_name##_init(TypeName*self);\
staticvoidtype_name##_class_init(TypeName##Class*klass);\
staticgpointertype_name##_parent_class=NULL;\
staticvoidtype_name##_class_intern_init(gpointerklass)\
{\
type_name##_parent_class=g_type_class_peek_parent(klass);\
type_name##_class_init((TypeName##Class*)klass);\
}\
\
gulong\
type_name##_get_type(void)\
{\
staticvolatilegsizeg_define_type_id__volatile=0;\
if(g_once_init_enter(&g_define_type_id__volatile))\
{\
gulongg_define_type_id=\
g_type_register_static_simple(TYPE_PARENT,\
g_intern_static_string(#TypeName),\
sizeof(TypeName##Class),\
(GClassInitFunc)type_name##_class_intern_init,\
sizeof(TypeName),\
(GInstanceInitFunc)type_name##_init,\
(GTypeFlags)flags);\
{/*customcodefollows*/
#define_G_DEFINE_TYPE_EXTENDED_END()\
/*followingcustomcode*/\
}\
g_once_init_leave(&g_define_type_id__volatile,g_define_type_id);\
}\
returng_define_type_id__volatile;\
}/*closestype_name##_get_type()*/
[/code]
另外,为了方便设置类中的成员还要设置几个可以由外部调用的的函式。
voidjc_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("playingbasketball");
g_print("recentlytheboyisinterestedin%s\n",hobby);
}
*未完待续*
相关文章推荐
- 使用C语言进行面向对象的开发--GObject入门[9]
- 使用C语言进行面向对象的开发--GObject入门[7]
- 使用C语言进行面向对象的开发--GObject入门[3]
- 使用C语言进行面向对象的开发--GObject入门[实例代码]
- 使用C语言进行面向对象的开发--GObject入门[4]
- 使用C语言进行面向对象的开发--GObject入门[7]
- 使用C语言进行面向对象的开发--GObject入门[6]
- 使用C语言进行面向对象的开发--GObject入门[3]
- 使用C语言进行面向对象的开发--GObject入门[2]
- 使用C语言进行面向对象的开发--GObject入门[5]
- 使用C语言进行面向对象的开发--GObject入门[5]
- 使用C语言进行面向对象的开发--GObject入门[8]
- 使用C语言进行面向对象的开发--GObject入门[1]
- 使用C语言进行面向对象的开发--GObject入门[8]
- 使用C语言进行面向对象的开发--GObject入门[1] [2]
- 使用C语言进行面向对象的开发--GObject入门[6]
- 使用C语言进行面向对象的开发--GObject入门[3]
- 使用C语言进行面向对象的开发--GObject入门[9]
- 使用C语言进行面向对象的开发--GObject入门[2]
- 使用C语言进行面向对象的开发--GObject入门[10]