现在的位置: 首页 > 综合 > 正文

GObject的类与信号(1)

2013年10月26日 ⁄ 综合 ⁄ 共 2512字 ⁄ 字号 评论关闭

GObject的类与信号(1

作者:水木杨

Gtk的人,不得不说GObject。如果你不懂GObject,那么就别告诉我你会Gtk

其实本人并不是太喜欢Gtk,相比之下图形工具我更喜欢Qt。刚接触Gtk不是很久,由于工作需要,我接触到了Gtk,既然去做,咱就要做出个样子。所以偶觉得有必要好好研究研究Gtk,,,搞了几个工具条,notebook等小例子之后就感觉不够用了。。。所以又不得不学GObject。迷茫复迷茫,把我愁断肠!

何为GObject?不懂。

人家都说,GObject就是用C来实现面向对象的特性的一种机制,它像C++一样,也有类,可我还是不懂。所以,百度,谷歌,也不管哪个搜索引擎好,也不管国产还是他产,只要能搜出来我想要的结果我都去干,,,(感觉有点不择手段呐(*^__^*) )。

有个老兄说,GObject中每个类要定义两个结构体,一个不带class,一个带class。不带class的是真结构体,带class的也是真结构体(废话,嘿嘿)。那么,GObject肯定不会没事闲的蛋疼的来给我们定义结构体,这是有原因的。带class的结构体就是我们要关注的核心,模拟面向对象的过程。

什么面向对象不对象的,说白了,面向对象的类无非是包括函数和方法,知道了这个,用C去模拟面向对象,还有什么难的呢?是不是?

说这么多,还是先举个例子吧,,,了然?如果你要定义的类型是People,那么如上边所说你要定义两个结构体,一个名字不带class,一个带class,也就是一个结构体叫People,一个结构体叫PeopleClass。是了,很简单的说!

听说,出来混迟早要还的。你想用C来模拟面向对象,可是你算哪棵葱?你写出来的代码没人承认。所以还得遵从游戏规则,学习GObject的规则。

GObject中一个对象的产生遵循如下原则:

唠叨一句,其实GObject蛮啰嗦的,想用GObject定义对象,你先要一段宏定义。

类前的宏定义宏的格式一般都是“域名_类名_其他”,虽然这样不是必须的,但是这样写比较人性化。例如我定义的宏是MY _GIRL_TYPE 这个是随便起的。但是一般都有特定含义的(见名知义),比如我的MY _GIRL_TYPE,意思:域名是MYMY是我的的意思,这个跟我个人有关,你也可以写YOUR,就好像Gtk的函数一般都用Gtk开头一样,本人喜欢女孩,所以就用MY开头咯,嘎嘎。GIRL就是类名了,然后TYPE(表达出意思就行,不一定非得是TYPE)。

这些都是放在mygirl.h中的

#ifndef _MYGIRL_

#define _MYGIRL_


#define MY _GIRL_TYPE(My_girl_get_type ())/*获取类型,有的是将TYPE放中间*/ #define MY_GIRL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_GIRL_TYPE, MyGirl)) /*实例类型转换*/
#define
 MY_IS_GIRL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_GIRL_TYPE))/* 实例类型检测*/
/*
类结构转换*/

#define MY_GIRL_CLASS(myclass) (G_TYPE_CHECK_CLASS_CAST ((myclass), MY_GIRL_TYPE, MyGirlClass))
/*类结构判定*/

#define MY_IS_GIRL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MY_GIRL_TYPE))
/*获取类结构*/

#define MY_GIRL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MY_GIRL_TYPE, MyGirlClass))
/*获取私有结构,如果没有可不定义该宏*/

#define MY_GIRL_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), MY_GIRL_TYPE, MYGirlPrivate))

这么长,你还甭生气,这才是刚开始,这就是GObject的规矩。只要是你正经的定义一个类,上面的宏你必须的有的,就是类型判断,检测之类的,因为它没有C++中的那种机制。

定义了这么一堆东西该怎么用,简单说一下,比如实例类型转换时,要将一个继承自GIRL的对象woman转换成girl就可以使用MY_GIRL(woman),这是不是会很方便呐,,,听哥哥的话,一定要这么定义宏,乖~嘿嘿!

宏定义过,然后就开始定义类了,不过人家GObject一般都是这么来的:

typedef struct _MyGirl MyGirl;    /*GObject中直接定义的结构一下划线开头_*/

typedef struct _MyGirlClass MyGirlClass;/*为什么用typedef再取个名字,我也没搞懂*/

 

struct _MyGirl

{

     GObject parent; /*父类是GObject,必须的*/

 

     gint age;        /*C结构体中,数据成员都是公有的*/

     gchar *name;

          gboolean slim;  /*是不是苗条*/

 

};

struct _MyGirlClass {

     GObjectClass parent_class;

 

     void (*girl_born_baby)(void);/* 用函数指针,,,代替函数,因为C语言不允许结构体中有函数,生孩子函数*/

};  /*我的女孩类定义完毕*/

#endif

 

可以看到每个结构中的第一项描述的是其父类相关的结构,这是为了模拟继承的机制,而所谓的publicprivate则只能靠程序员自己理解了。

那么,我们的女孩类也就创建成了,虽然缺胳膊少腿,但是好歹也是个女的,是我们用C语言写的一个女孩类,小高兴下,,,嘎嘎。

该怎么写一个比较漂亮,身材比较好的女孩类呢?下回分解,,,

抱歉!评论已关闭.