用C实现C++的多态---剖析GTK的"对象" (二)

本文介绍了如何使用C语言构造一个类似C++的多态对象系统,通过分析GTK的‘对象’实现。文章讨论了如何定义对象结构、对象池的初始化、注册对象以及创建对象实例的过程,揭示了C语言实现多态的基本思路。
摘要由CSDN通过智能技术生成

四. 如何构造一个对象
    我们用下面的结构来描述一个对象:
    typedef struct _ClassType
    {
        char* name; /*对象名,唯一*/
        int   object_size;/*对象大小,创建实列时分配内存要用到*/
        int   class_size; /*全部虚函数大小,如sizeof(CObjectClass)*/
        void* vclass; /*虚函数指针*/
        void (*InitClassCallback)(void*); /*给对象的虚函数赋值*/
        void (*InitObjectCallback)(void*);/*对象实例化时,给实例成员赋初值,有点类似构造函数*/
        struct _ClassType*  parent; /*父对象*/
        struct _ClassType*  next; /*单向链表,指向下一对象*/
    }ClassType;
   
    #define [MAX_CLASS_NUM 128
    static ClassType classes[MAX_CLASS_NUM]; /*对象池*/
    static ClassType *used_classes = NULL;
    static ClassType *free_classes = NULL;
    这里只定义了128个对象,数目可能修改或者改成动态分配。

    初始化,全部链接到空闲链表中。
    void InitObjectLib(void)
    {
        int i;
        memset(classes, 0, sizeof(ClassType)*MAX_CLASS_NUM);
        for( i=0;i<MAX_CLASS_NUM-1;i++ )
        {
            classes[i].next = &(classes[i+1]);
        } 
        free_classes = &(classes[0]);
    }

    这个函数既是获取对象的虚函数指针,也是注册对象。
    这里要注意type为static,一个对象只注册一次,下次获取时直接取type。
    RegisterCla

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值