疯狂指针(1)

有了那些const.h的定义后,我们就可以开工了。
首先我们先定义一个元素类Class Element,这个类是下面我们实现线性表List、栈Stack等等基础数据结构的关键。

一般来说,定义一个类,如果这个类有多种实现方式,比如说线性表List可以用数组Array和链表Chain这两种形式来实现,那么这个时候我们就要把List所应该具备有的基本功能抽象出来,作为所有不同方法实现线性表的公共接口。其他类如果要调用线性表,那么它只需要实例化一个List类就可以了,而不关心这个List到底是ArrayList还是ChainList。

扩展开来,我推荐在写类的时候,先把这个类应该有的功能抽象出来作为一个独立的H文件。比如Class Element类,我们就把它分开为Element.h和Element.c,其中Element.h是Class Element的应该有的功能的抽象,说白了,就是Element的接口

//Element.h
Class Element{
    Object value;//元素类所存放的值,这是一个抽象的void*,意味着可以存放任何类型的数据
    void (*destroy)(Class Element *this);//销毁
    void (*clear)(Class Element *this);//清除,把value的内容free掉
    Class Element *prior;//前驱节点
    Class Element *next; //后继节点
};

 

接下来就是对这个接口的实现了Element.c

void Element_Destroy(Class Element *this){
        this->clear(this);
        free(this);
}

void Element_Clear(Class Element *this){
        if(this->value != Null)
            free(this->value);
}

Class Element *Element_new(Object value){
    Class Element *this = (Class Element*)malloc(sizeof(Class Element));
        this->destroy = Element_Destroy;
        this->clear = Element_Clear;
        this->value = value;
        this->prior = Null;
        this->next = Null;
        return this;
}

这里简单说明一下一个特殊方法(函数)的命名规则,当然这个规则是我自己定的啦。就是实例化这个类的时候我们统一一个格式 Class 类名 *实例名 = 类名_new([参数]);
就拿这个Class Element来说,如果我们要实例化这个类,则
Class Element *e = Element_new( Integer_new(100) );
还记得const.h中定义的Integer把, 就是#define Integer int*。

下面是一个使用Class Element的程序例子

#include "const.h"
#include "Element.h"
#include "Element.c"
int main(void){
    Class Element *e = Element_new( Integer_new(100) );
        printf("%d/n",*(Integer)e->value);
        e->clear(e);
        e = Element_new( String_new("Hello MM!") );
        printf("%s/n",(String)e->value);
        e->destroy(e);
        return 0;
}

输出:
100
Hello MM!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值