你将学到什么

如何实现Object的方法

Object的方法

Object的public方法

在头文件声明一个函数,然后在源文件中实现函数即可

/* declaration in the header. */
void viewer_file_open (ViewerFile *self,
GError **error); /* implementation in the source file */
void
viewer_file_open (ViewerFile *self,
GError **error)
{
g_return_if_fail (VIEWER_IS_FILE (self));
g_return_if_fail (error == NULL || *error == NULL); /* do stuff here. */
}

Object的public虚函数

GObject通过函数指针的方式来模拟C++语言的虚函数实现,具体步骤如下:

  • 在类结构定义里面设置一个函数指针,然后定义一个public方法(用来调用函数指针)
  • 在源文件里实现public方法(核心就是调用函数指针)
  • 在基类的class_init函数设虚函数指针,指向函数的实现,或者设置为NULL来模拟纯虚函数(子类必须实现函数并设置设置函数指针)

下面的open就是纯虚函数,close就是虚函数

/* declaration in viewer-file.h. */
#define VIEWER_TYPE_FILE viewer_file_get_type ()
G_DECLARE_DERIVABLE_TYPE (ViewerFile, viewer_file, VIEWER, FILE, GObject) struct _ViewerFileClass
{
GObjectClass parent_class; /* stuff */
void (*open) (ViewerFile *self,
GError **error);
void (*close) (ViewerFile *self,
GError **error); /* Padding to allow adding up to 12 new virtual functions without
* breaking ABI. */
gpointer padding[12];
}; void viewer_file_open (ViewerFile *self,
GError **error);
void viewer_file_close (ViewerFile *self,
GError **error); /* implementation in viewer-file.c */
void viewer_file_open (ViewerFile *self,
GError **error); static void
viewer_file_real_close (ViewerFile *self,
GError **error)
{
/* Default implementation for the virtual method. */
} static void
viewer_file_class_init (ViewerFileClass *klass)
{
/* this is not necessary, except for demonstration purposes.
*
* pure virtual method: mandates implementation in children.
*/
klass->open = NULL; /* merely virtual method. */
klass->close = viewer_file_real_close;
} void
viewer_file_open (ViewerFile *self,
GError **error)
{
ViewerFileClass *klass; g_return_if_fail (VIEWER_IS_FILE (self));
g_return_if_fail (error == NULL || *error == NULL); klass = VIEWER_FILE_GET_CLASS (self); /* if the method is purely virtual, then it is a good idea to
* check that it has been overridden before calling it, and,
* depending on the intent of the class, either ignore it silently
* or warn the user.
*/
g_return_if_fail (klass->open != NULL);
klass->open (self, error);
} void
viewer_file_close (ViewerFile *self,
GError **error)
{
ViewerFileClass *klass; g_return_if_fail (VIEWER_IS_FILE (self));
g_return_if_fail (error == NULL || *error == NULL); klass = VIEWER_FILE_GET_CLASS (self);
if (klass->close != NULL)
klass->close (self, error);
}

Object的private虚函数

只要在头文件不提供调用虚函数指针的public方法就可以了,比如去掉上面代码头文件里的void viewer_file_close(ViewerFile *self, GError **error);函数定义,然后在源文件的函数实现前面加上static关键字限制函数作用域为当前文件即可。

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

  1. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  2. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  3. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  4. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  5. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  6. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  7. NumPy学习笔记 三 股票价格

    NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...

  8. Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  10. Typescript 学习笔记三:函数

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

随机推荐

  1. jenkins 参数化构建,获取git分支

    def heads= ("git ls-remote -h git@gitlab.com:*.git").execute()def headlist=heads.text.read ...

  2. 使用while 打印10~1,1~10

    使用while 打印10~1,1~10 #!/bin/bash i= ));do echo $i ((i--)) done 答案:109876543210 i= ));do echo $i ((i++ ...

  3. (转)C#正则表达式Regex类的用法

    原文地址如下:http://www.studyofnet.com/news/297.html 一.C#正则表达式符号模式 字 符 描 述 \ 转义字符,将一个具有特殊功能的字符转义为一个普通字符,或反 ...

  4. QT5 地图的使用

    https://blog.csdn.net/qq_28877125/article/details/80561829 博客园地址 资源下载地址: https://download.csdn.net/d ...

  5. java代码输出质因数

    package com.badu; import java.util.Scanner; //分解质因数问题: //从键盘输一个数, //首先最小质因数为2 //n不能被2整除时, //n能被2整除时, ...

  6. Drools学习笔记3—Conditions / LHS—字段约束连接&字段约束操作符

    字段约束连接 用于字段约束 对象内部多个约束连接,采用“&&”(and).“||”(or)和“,”(and) 执行顺序:“&&”(and).“||”(or)和“,” 字 ...

  7. MySessionFactory

    package com.ORM; import org.hibernate.HibernateException; import org.hibernate.Session; import org.h ...

  8. flask 电影系统(2)

    标签,电影,上映预告数据模型设计 标签数据类型 id:编号 name:标题 movies:电影外键关联 addtime:创建时间 定义电影数据模型 id:编号 title:电影标题 url:电影地址 ...

  9. jdbc.properties 文件的配置

    jdbc.properties文件的配置   使用配置文件访问数据库的优点是: 一次编写随时调用,数据库类型发生变化只需要修改配置文件. 配置文件的设置: 在配置文件中,key-value对应的方式编 ...

  10. bzoj 1568 李超线段树

    博客:http://www.cnblogs.com/mangoyang/p/9979465.html 李超线段树支持两种操作:1:插入一条直线.2:询问在x = c与这些直线的交点中最大的y坐标. 插 ...