GObject:用C实现类是如何做到的

本文介绍了如何使用C语言基于GObject库实现类的封装和继承。通过实例化双向链表数据结构,展示了如何构建类结构体和实例结构体,以及如何利用G_DEFINE_TYPE宏进行类型注册。GObject提供的功能包括内存管理、构造/析构函数、属性操作和信号机制。文章还探讨了对象和实例的概念,并分析了PM_TYPE_DLIST宏的作用。
摘要由CSDN通过智能技术生成

本文完全参考:http://garfileo.is-programmer.com/posts/24798.html,在此感谢gargileo写的优美的博文。


GObject库很麻烦,参考手册除了是英文之外更是晦涩。本文的代码都是参考照搬的,只是把原来的语言本地化了一下~~。

我们会创作一个双向链表,然后把它发展成一个类!

一、从一个双向链表的数据结构开始

经过指针摧残之后还有兴趣的人,应该会接触到数据结构这个BOSS,里面的双向链表是一个很NB的东西,是我经过长期努力,掌握的第一个高级货。

下面的代码是一个简单的双向链表的代码:

#ifndef DOUBLE_LIST_H
#define DOUBLE_LIST_H
 
struct double_list_node {
        struct doule_list_node *prev;
        struct double_list_node *next;
        void *data;
};
 
struct double_list {
        struct double_list_node *head;
        struct double_list_node *tail;
};
 
#endif

这是最为原始的代码,通常我们会使用typedef来定义个数据类型,目的是把struct _xxx变成xxx。省去了写struct的重复劳动。

另外,double_list经常是被习惯的写为dlist。有时候缩写总是显得高级一些,比如生活大爆炸里我就学会了AFK——away from keyboard,也就是离开电脑一会的意思。

下面的代码会让你看上去专业一些:

#ifndef DLIST_H
#define DLIST_H
 
typedef struct _DListNode DListNode;
struct  _DListNode {
        DListNode *prev;
        DListNode *next;
        void *data;
};
 
typedef struct _DList DList;
struct  _DList {
        DListNode *head;
        DListNode *tail;
};
 
#endif
至此,代码跟GObject没有一点关系,我们只是渐进的来熟悉结构体这个东西。

通常一个双向链表是不够用的,项目中经常会用到多个数据结构,这时候,命名就有学问了,不然容易重名,起冲突。

因此,缩写又站出来大显神威了,比如dlist我们可以根据需要加上前缀,ADList可以理解成apple_double_list么,哈哈。

原文作者介绍了一个叫做PT格式的缩写习惯,Project_Type_Double_List。简称PTDList。当然了,他举得是一个叫做多面体建模的例子,多面体:Polyhedron Modeling,因此就叫做PMDList了。

其实叫什么不重要,重要的是理解这种思想。

那么现在的代码就升级为:

#ifndef PM_DLIST_H
#define PM_DLIST_H
 
typedef struct _PMDListNode PMDListNode;
struct  _PMDListNode {
        PMD
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值