你将学到什么

如何使用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. docker 摆渡镜像脚本

    #!/bin/bash if [ $# != 1 ];then echo "Param error";exit; fi DOCKER_NAME=$1 IMAGE_TAG=${DOC ...

  2. mysql函数之二:left,right,substring,substring_index MySQL截取字符串函数方法

    函数: 1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例:select left(content,200) as abstract from my ...

  3. HTML5的离线应用

    参考:有趣的HTML5:离线存储——segmentfault HTML5的离线存储 简介 HTML5提供了很多新的功能以及相应的接口,离线存储就是其中的一个.通过浏览器访问Web App需要联网发送请 ...

  4. Python多进程-进程锁

    多进程虽然不允许多个进程同时修改同一份数据,但是多进程也有锁,为了在屏幕上打印的时候不出现两个进程同时执行的显示错误 # -*- coding:utf-8 -*- __author__ = " ...

  5. taskkill /f /t /im processName

    /*@echo off */taskkill /f /t /im WINWORD.exetaskkill /f /t /im nginx.exetaskkill /f /t /im w3wp.exet ...

  6. LAMP 2.7 Apache通过rewrite限制某个目录

    我们可以 allow 和 deny 去现在网站根目录下的某个子目录,当然这个 rewrite 也可以实现,配置如下: 创建一个目录和文件随便写些东西 mkdir /data/www/data/tmp ...

  7. DAY18-Django之分页和中间件

    分页 Django的分页器(paginator) view from django.shortcuts import render,HttpResponse # Create your views h ...

  8. C#如何拿到从http上返回JSON数据?

    第一章:C#如何拿到从http上返回JSON数据? 第二章:C#如何解析JSON数据?(反序列化对象) 第三章:C#如何生成JSON字符串?(序列化对象) 第四章:C#如何生成JSON字符串提交给接口 ...

  9. python pdb 基础调试

    当手边没有IDE,面对着python调试犯愁时,你就可以参考下本文:(pdb 命令调试) 参考:http://docs.python.org/library/pdb.html 和 (pdb)help ...

  10. mysql 打印随机数

    select rand(); 这样取出来的数据是类似这样的: 0.5389902438400223 要几位自己取几位: 取得方法类似 select substr(concat("000000 ...