zoukankan      html  css  js  c++  java
  • 使用C语言进行面向对象的开发--GObject入门[3]

    

    Part 3

    终于要谈正题了,如何使用GObject去构件一个所谓的“对象”呢?其实是一件简单但却痛苦的事情。

    在罗列代码之前,还是要啰嗦两句。

    GObject中每个类要定义两个结构体,假设你要定义的类型为People,那么你要定义两个结构分别名为People和PeopleClass,估计刚接触的人会有些晕,一般的C++啊,JAVA什么的都是直接一个class了事儿了。但记住C本身并没有面向对象的机制,这里这样做也仅仅是为了模拟。名为PeopleClass的结构是表示类的结构,而名为People的结构则是这个类的实例,可能这么说一般人还会有点摸不着头脑,切记,这是一种模拟。

    在GObject中一个对象的产生遵循如下原则,

    如果产生的是该类的第一个实例,那么先分配Class结构,再分配针对该实例的结构。否则直接分配针对该实例的结构。

    也就是说在Class结构中所有的内容,是通过该类生成的实例所公有的。而实例化每个对象时,为其单独分配专门的实例用结构。

    下面要看些代码了,也领略下GObject令人痛苦的地方,

    先看一段宏定义,也是用GObject定义对象所必须的,

    其中JC为域,换成别的什么都成,只是一个我个人所使用的缩写,正如GTK这三个字母一般,而实际要定义的就是一个BOY,具体每个宏是干什么的都写了简单的注释。


    获取类型
    #define  JC_TYPE_BOY    (jc_boy_get_type ())
    //实例类型转换
    #define  JC_BOY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), JC_TYPE_BOY, JcBoy))
    //实例类型判定
    #define  JC_IS_BOY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), JC_TYPE_BOY))
    //类结构转换
    #define  JC_BOY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass),         JC_TYPE_BOY, JcBoyClass))
    //类结构判定
    #define  JC_IS_BOY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),

    JC_TYPE_BOY))
    //获取类结构
    #define  JC_BOY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),

    JC_TYPE_BOY, JcBoyClass))
    //获取私有结构,如果没有可不定义该宏
    #define  JC_BOY_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj),

    JC_TYPE_BOY, JcBoyPrivate))

     

    P.S.基本上都是 域_类名_***的结构,也就是JC_BOY_***,如果每次都自己写还是很麻烦的,所以用GObject基本上copy的次数会很多。

     

    定义了这么一堆东西该怎么用,简单说一下,比如实例类型转换时,要将一个继承自BOY的对象man转换成BOY就可以使用JC_BOY(man),还是那句话,重在理解。

     

    下面开始定义前面所说的几个结构

    struct _JcBoy      JcBoy;
    typedef 
    struct _JcBoyClass   JcBoyClass;
    /* object */
    struct _JcBoy
    {
        JcBaby parent_instance;
    /* public */  // 

        
    /*< private >*/    
        JcBoyPrivate 
    *priv;
    };
    /* class */
    struct _JcBoyClass

    {
        JcBabyClass parent_class;

    /* class members */
    ////.
      
        
    /* Virtual method or signals*/ void (*play)(JcBoy *self);
    };

    可以看到每个结构中的第一项描述的是其父类相关的结构,这是为了模拟继承的机制,而所谓的public和private则只能靠程序员自己理解了。另外,比较好的声明方式是在实例结构中定义一个名为private的指针,指向专门结构体。

    如下,

    typedef struct _JcBoyPrivate JcBoyPrivate;

    struct _JcBoyPrivate

    {

    gchar *name;

    guint age;

    gchar *hobby;

    };

    P.S. 假设男孩儿类具有名字,年龄,爱好三个成员,且名字和爱好在类生成时在堆中动态分配。

    *未完待续*

  • 相关阅读:
    MVC3、如何应用EntityFramework 连接MySql 数据库 Kevin
    DEV EXPRESS Summary Footer 不显示 Kevin
    装饰模式 Kevin
    Dev 控件 GridControl 控件 二次绑定数据源的问题。 Kevin
    System.InvalidOperationException 异常 Kevin
    LINQ to XML Kevin
    代理模式——代码版“吊丝的故事” Kevin
    VS2012 中的设备 面板 Kevin
    maven 学习笔记(三)创建一个较复杂的 eclipse+android+maven 工程
    maven 学习笔记(一)eclipse+android+maven
  • 原文地址:https://www.cnblogs.com/zhangze/p/1740344.html
Copyright © 2011-2022 走看看