当前位置:主页   - 电脑 - 程序设计 - C/C++
使用C语言进行面向对象的开发--GObject入门[4]
来源:网络   作者:平繁   更新时间:2011-09-23
收藏此页】    【字号    】    【打印】    【关闭

  对于GObject而言,有了实例结构,有了类结构,自然要有如何初始化的函式,毕竟这是C语言吗,没有那么方便的事儿。

  相应的,对应于jc_boy,要定义jc_boy_init和jc_boy_class_init两个函式,当然他们分别对应于实例结构和类结构的初始化。

static void
jc_boy_init (JcBoy *self)
{
  JcBoyPrivate *priv=NULL;
  pri=self->private = JC_BOY_GET_PRIVATE (self); 
  priv->name=g_strdup("no-name");
priv->hobby=g_strdup("nothing");
priv->age=0;
}

  static用于声明作用域,对于由多个文件构成的工程而言,很有必要。

  看到JC_BOY_GET_PRIVATE了吧,就是前面的那个宏定义,它调用的是G_TYPE_INSTANCE_GET_PRIVATE,一看全都是大写和下划线,直觉告诉我们这还是宏定义,没错,它调用的是g_type_instance_get_private。 有时感觉这么折腾几下会很麻烦,但GObject就是建议大家这么用,如果你不想使用那么一堆宏定义,那么直接使用g_type_instance_get_private之类的函式也是可以的。

  JC_BOY_GET_PRIVATE获取了一个指向实例私有结构体的一个指针,接下来就是对其初始化了,注意g_strdup在堆上分配了一个字符串,在后面介绍的类的析构的时候,我们应该将其free一下。

  P.S.你可以把这里的init理解为construtor,也可以不这样理解,因为GObject的类中提供了construtor函式,你可以在你定义的类中重写它。但是一般简单的应用直接在初始化函式中处理了。

  下面再看下类结构的初始化

static void
jc_boy_class_init (JcBoyClass *klass)
{
    g_type_class_add_private (klass, sizeof (JcBoyPrivate));
    klass->play=play;
}

编缉推荐阅读以下文章

  • 使用C语言进行面向对象的开发--GObject入门[5]
  • 使用C语言进行面向对象的开发--GObject入门[3]
  • 使用C语言进行面向对象的开发--GObject入门[2]
  • 使用C语言进行面向对象的开发--GObject入门[1]
其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明