你将学到什么

如何使用GObject实现一个新类

类头文件

声明一个类型的方法选择取决于类型是可被继承的还是不可被继承的。

  • 不可被继承的类型(Final类型)使用G_DECLARE_FINAL_TYPE宏来定义,还需要在源文件(不是在头文件)中定义一个结构来保存类实例数据。
/*
* Copyright/Licensing information.
*/ /* inclusion guard */
#ifndef __VIEWER_FILE_H__
#define __VIEWER_FILE_H__ #include <glib-object.h>
/*
* Potentially, include other headers on which this header depends.
*/ G_BEGIN_DECLS /*
* Type declaration.
*/
#define VIEWER_TYPE_FILE viewer_file_get_type ()
G_DECLARE_FINAL_TYPE (ViewerFile, viewer_file, VIEWER, FILE, GObject) /*
* Method definitions.
*/
ViewerFile *viewer_file_new (void); G_END_DECLS #endif /* __VIEWER_FILE_H__ */
  • 可被继承的类型使用G_DECLARE_DERIVABLE_TYPE宏来定义
/*
* Copyright/Licensing information.
*/ /* inclusion guard */
#ifndef __VIEWER_FILE_H__
#define __VIEWER_FILE_H__ #include <glib-object.h>
/*
* Potentially, include other headers on which this header depends.
*/ G_BEGIN_DECLS /*
* Type declaration.
*/
#define VIEWER_TYPE_FILE viewer_file_get_type ()
G_DECLARE_DERIVABLE_TYPE (ViewerFile, viewer_file, VIEWER, FILE, GObject) struct _ViewerFileClass
{
GObjectClass parent_class; /* Class virtual function fields. */
void (* open) (ViewerFile *file,
GError **error); /* Padding to allow adding up to 12 new virtual functions without
* breaking ABI. */
gpointer padding[12];
}; /*
* Method definitions.
*/
ViewerFile *viewer_file_new (void); G_END_DECLS #endif /* __VIEWER_FILE_H__ */

类源文件

源文件第一步就是包含上面的头文件

/*
* Copyright information
*/ #include "viewer-file.h" /* Private structure definition. */
typedef struct {
gchar *filename;
/* stuff */
} ViewerFilePrivate; /*
* forward definitions
*/

如果定义的是不可继承类型,还需要定义类实例数据结构

struct _ViewerFile
{
GObject parent_instance; /* Other members, including private data. */
}

调用G_DEFINE_TYPE将会:

  • 实现viewer_file_get_type函数
  • 定义了一个能在源文件范围内访问父类的指针
  • 使用G_DEFINE_TYPE_WITH_PRIVATE宏添加私有的实例数据到类型上

如果定义的是不可继承类型,使用G_DECLARE_FINAL_TYPE将私有数据存放在实例结构中,实例结构外部无法访问,也不会被其他类继承(因为定义的是不可继承类型)。

你也可以使用G_DEFINE_TYPE_WITH_CODE宏来控制get_type函数的实现,例如插入一个G_IMPLEMENT_INTERFACE宏实现的接口。

Glib学习笔记(一)的更多相关文章

  1. Glib学习笔记(四)

    你将学到什么 使用GObject模拟实现接口 使用接口 首先按照学习笔记(一)定义一个普通的GObject类 使用G_DEFINE_TYPE_WITH_CODE和G_IMPLEMENT_INTERFA ...

  2. Glib学习笔记(二)

    你将学到什么 如何实现Object的构造函数和析构函数 如何在条件检测不允许的情况下终止对象创建 Object的构造函数 对象的构造函数是不允许失败,如果你需要一个允许失败的GObject构造函数,使 ...

  3. Glib学习笔记(三)

    你将学到什么 如何实现Object的方法 Object的方法 Object的public方法 在头文件声明一个函数,然后在源文件中实现函数即可 /* declaration in the header ...

  4. DBus学习笔记

    摘要:DBus作为一个轻量级的IPC被越来越多的平台接受,在MeeGo中DBus也是主要的进程间通信方式,这个笔记将从基本概念开始记录笔者学习DBus的过程 [1] DBus学习笔记一:DBus学习的 ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  7. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  8. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  9. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

随机推荐

  1. Python 函数之装饰器

    1.函数 #### 第一波 #### def foo(): print 'foo' foo #表示是函数 foo() #表示执行foo函数 #### 第二波 #### def foo(): print ...

  2. DB字段顺序与类的属性顺序一致:{Oracle.DataAccess.Client.OracleException ORA-00932: 数据类型不一致: 应为 TIMESTAMP, 但却获得 NUMBER

    {Oracle.DataAccess.Client.OracleException ORA-00932: 数据类型不一致: 应为 TIMESTAMP, 但却获得 NUMBER     应用程序中类型T ...

  3. catkin 工作空间

    catkin 工作空间:组织和管理功能包的文件夹,以 catkin 工具编译 建立工作空间 sch01ar@ubuntu:~$ mkdir -p ~/catkin_ws/src sch01ar@ubu ...

  4. 2016.8.17服务器端数据库用户导入导出方法 expdp和impdp

    EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用. IMP只适用于EXP导出的 ...

  5. 从一个简单的小实例分析JSP+Servelt与JSP+Struts2框架的区别

    最近在学struts2,struts2相比以前的JSP+Servlet,在处理流程上的更简单,我们就一个小实例来具体分析一下. 实例内容如下: 实现一个简单的注册页面包括:用户名.密码.重复密码.年龄 ...

  6. 10-21C#基础--集合

    二.集合  //定义一个集合,集合是一个类, 1. 定义: ArrayList al = new ArrayList(); 2.添加数据:al.add();//添加数值,可以添加无数个元素,集合中没有 ...

  7. leetcode458

    原本没有思路,参考了网上的解题思路,自己独立完成了代码. int poorPigs(int buckets, int minutesToDie, int minutesToTest) { ; ; wh ...

  8. leetcode241

    public class Solution { public IList<int> DiffWaysToCompute(string input) { List<int> re ...

  9. 【WebRTC】术语

    WebRTC,名称源自网页实时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的API.它于2011年6月1日开源并在Goog ...

  10. 解决html中的乱码问题

    1.最简单粗暴的方法就是加一个meta标签,不过值得我们注意的是我们的meta标签是与我们的head标签是同一级的,所以千万不能将meta标签加到我们的head标签中. <meta http-e ...