你将学到什么

如何实现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关键字限制函数作用域为当前文件即可。

最新文章

  1. Linq语法详细
  2. lua特性纪要
  3. 电量/信号的显示 imageLevel
  4. 用JS实现九九乘法表
  5. python基础(三)序列
  6. java环境配置笔记
  7. WPF--Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析
  8. plsql记住登录密码
  9. C++中复制构造函数与重载赋值操作符总结
  10. net core 实战之 redis 负载均衡和"高可用"实现
  11. c++ 异常处理 assert | try
  12. 面试:如何找出字符串的字典序全排列的第N种
  13. Recommending music on Spotify with deep learning 采用深度学习算法为Spotify做基于内容的音乐推荐
  14. 阿里2016实习offer五面经验与总结(转)
  15. "Cannot find entry symbol nable-stdcll-fixup; defaulting to 00401000" 解决方案
  16. Linux关机重启指令
  17. mysql_函数
  18. Python textwrap模块(文本包装和填充)
  19. mysql添加字段语句
  20. java代码示例(2)

热门文章

  1. C# 常用文件操作
  2. 蓝桥杯 基础训练 BASIC-27 2n皇后问题
  3. Spring学习五
  4. PHP函数(六)-匿名函数(闭包函数)
  5. 2015.5.11 string与byte[]相互转换
  6. ghld data format
  7. 【持久化框架】SpringMVC+Spring4+Mybatis3集成,开发简单Web项目+源码下载
  8. 关于handler和异步任务
  9. 40、inner mate distance for paired reads in a bam file
  10. 前端基础 之JS