使用C语言进行面向对象的开发--GObject入门[4]
转载请注明出处 blog.csdn.net/pingf0 或www.cnblogs.com/pingf
Part 4
接上文.
前面定义了几个结构,我们可以把那些东西放在一个jc_boy.h文件中,下面开始介绍如何去实现这个BOY类,也就是要放在jc_boy.c中的部分。
对于GObject而言,有了实例结构,有了类结构,自然要有如何初始化的函式,毕竟这是C语言吗,没有那么方便的事儿。
相应的,对应于jc_boy,要定义jc_boy_init和jc_boy_class_init两个函式,当然他们分别对应于实例结构和类结构的初始化。
static void
jc_boy_init (JcBoy *self)
{
JcBoyPrivate *priv=NULL;
pri=self->private = JC_BOY_GET_PRIVATE (self);
priv->name=g_strdup("no-name");
priv->hobby=g_strdup("nothing");
priv->age=0;
}
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函式,你可以在你定义的类中重写它。但是一般简单的应用直接在初始化函式中处理了。
下面再看下类结构的初始化
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为例
GType g_type_register_static(GType parent_type,
const gchar *type_name,
const GTypeInfo *info,
GTypeFlags flags);
看英文大概能明白每个参数是干嘛的,这里面比较麻烦的是GTypeInfo,还是简单看下
typedef struct {
/* interface types, classed types, instantiated types */
guint16 class_size;
GBaseInitFunc base_init;
GBaseFinalizeFunc base_finalize;
/* interface types, classed types, instantiated types */
GClassInitFunc class_init;
GClassFinalizeFunc class_finalize;
gconstpointer class_data;
/* instantiated types */
guint16 instance_size;
guint16 n_preallocs;
GInstanceInitFunc instance_init;
/* value handling */
const GTypeValueTable *value_table;
} GTypeInfo;
不要多看,多看会更头晕,但这并不影响我们使用GObject来构建对象【什么?你非要弄明白?那别看本文了,本文标题写着入门俩字呢!。。。。。。其实主要原因是自己也没有完全研究透。。。。。。XD】
但是要明白这里向系统声明了init ,finalize等等函式。
为了简化这些步骤,GObject里面为我们提供了一些简化宏定义。
这里介绍一个比较简单的
G_DEFINE_TYPE (JcBoy , jc_boy , G_TYPE_OBJECT) ;
前两个函式主要用于宏展开,最后一个用于表明父类的类型【对于继承下来的类,最后一个参数可别用错】
还是展开看一下,其实还是比较麻烦的,具体我就不多说了。
#define G_DEFINE_TYPE(TN, t_n, T_P) G_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, 0, {})
#define G_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) \
\
static void type_name##_init (TypeName *self); \
static void type_name##_class_init (TypeName##Class *klass); \
static gpointer type_name##_parent_class = NULL; \
static void type_name##_class_intern_init (gpointer klass) \
{ \
type_name##_parent_class = g_type_class_peek_parent (klass); \
type_name##_class_init ((TypeName##Class*) klass); \
} \
\
gulong\
type_name##_get_type (void) \
{ \
static volatile gsize g_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); \
{ /* custom code follows */
#define _G_DEFINE_TYPE_EXTENDED_END() \
/* following custom code */ \
} \
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \
} \
return g_define_type_id__volatile; \
} /* closes type_name##_get_type() */
另外,为了方便设置类中的成员还要设置几个可以由外部调用的的函式。
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);
}
*未完待续*
转载于:https://www.cnblogs.com/pingf/archive/2009/11/21/1607565.html
使用C语言进行面向对象的开发--GObject入门[4]相关推荐
- 使用C语言进行面向对象的开发--GObject入门[2]
转载请注明出处 blog.csdn.net/pingf0 或www.cnblogs.com/pingf" PART 2. 在正式开始GObject的学习之前,还要简单提一下大名鼎鼎的建立在G ...
- 使用C语言进行面向对象的开发--GObject入门[5]
转载请注明出处 blog.csdn.net/pingf0 或www.cnblogs.com/pingf 接上文 这一部分简要介绍下类的析构,或者成为终结. 还是多说几句,也算是对前文的补充 1.生成一 ...
- 用C语言实现面向对象的开发
C语言的对象化模型 面向对象的特征主要包括: .封装,隐藏内部实现 .继承,复用现有代码 .多态,改写对象行为 采用C语言实现的关键是如何运用C语言本身的特性来实现上述面向对象的特征.1.1 封装 封 ...
- 【C语言】C 程序开发快速入门
文章目录 1. C 程序开发快速入门 2. C 程序运行机制流程 3. 编译.链接和运行详解 4. C 程序开发注意事项 5. 如果想只生成目标 exe 文件,不想执行结果 1. C 程序开发快速入门 ...
- html是面向对象的开发语言,Web开发常用的6大编程语言和优势
Web前端是互联网时代软件产品研发中不可缺少的一种专业研发角色,所有用户终端产品与视觉和交互有关的部分,都是Web前端工程师的专业领域.Web开发常用的6大编程语言和优势你知道多少,北大青鸟的老师带您 ...
- 《C++ 开发从入门到精通》——第2章 C++的重要特质分析2.1 什么是面向对象(object-oriented)...
本节书摘来自异步社区出版社<C++ 开发从入门到精通>一书中的第2章,第2.1节,作者: 王石磊 , 韩海玲,更多章节内容可以访问云栖社区"异步社区"公众号查看. 第2 ...
- OO开发思想:面向对象的开发方法(Object oriented,OO)
面向对象的开发方法(Object oriented,OO)认为是好文章吧,拿来分享一下(转载) 面向对象的开发方法(Object oriented,OO) 从事软件开发的工程 师们常常有这样 的体会: ...
- 一步步分析-C语言如何面向对象编程
这是道哥的第009篇原创 一.前言 在嵌入式开发中,C/C++语言是使用最普及的,在C++11版本之前,它们的语法是比较相似的,只不过C++提供了面向对象的编程方式. 虽然C++语言是从C语言发展而来 ...
- C语言到嵌入式Linux开发项目指导
C语言到嵌入式Linux开发项目指导 第一阶段C语言 1.常量与变量,数据类型,数据类型转换,数据输入与输出: 2.C语言运算符,C语言操作符,C语言表达式,表达式优先级: 3.C语言流程控制,分支, ...
- c语言uint32_使C语言实现面向对象的三个要素,你掌握了吗?
编排 | strongerHuang 微信公众号 | strongerHuang 不知道有多少人去了解过语言的发展史,早期C语言的语法功能其实比较简单.随着应用需求和场景的变化,C语言的语法功能在不断 ...
最新文章
- Xamarin iOS项目找不到模拟器
- NeurIPS审稿引发吐槽大会,落选者把荒唐意见怼了个遍:“我谢谢你们了”
- word 2010中如何创建多级目录和多级列表
- Android P DP1:WiFi-RTT、刘海、多摄像头、GIF动画、NNAPI 1.1
- Python-----学了今天,忘了昨天.
- 如何查找历史版本的SAP UI5 API文档
- mac pip安装mysql_Mac pip安装mysql-python失败
- 前端基础-html-标题标签
- 【SpringCloud】Spring cloud Alibaba Sentinel 服务降级 (阿里版本Hystrix)
- 一些人一旦离开原来的单位,就不爱再去了,是为什么?
- linux终端下的网页浏览器w3m
- 【十次方】Springboot中使用Redis做缓存
- Maya动画2:刚体+重力模拟小球掉落
- 如何快速统计任意一条线段的长度?
- (一)WLAN定义和基本架构
- “河南旦”的四个坟墓的故事·《晚唱·贾平凹》
- word2016开机后首次打开非常慢_终于找到了电脑开机时间长的原因了,一看就会,一招到位...
- Mysql自定义函数:身份证号码的真实性判定
- springCloud openFeign返回数据转型问题
- [C]奶牛生奶牛问题
热门文章
- 小D课堂 - 新版本微服务springcloud+Docker教程_4-03 高级篇幅之Ribbon负载均衡源码分析实战...
- 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_07.入门案例中使用的组件介绍
- css----苹果移动端以及小程序滚动模块卡顿的处理
- VMware虚拟机中的CentOS7安装Nginx后本机无法访问的解决办法
- [问题]apparmor 问题导致mysql切换datadir目录失败
- 机器学习的最佳入门学习资源【转】
- 公务员工资分配的一种方法
- 基于ASP.NET AJAX的WebPart开发与部署
- vuex的store机制1
- 十分钟教你使用NoteExpress