面向对象-类-C语言实现

最近在看《C嵌入式编程设计模式》这本书时,发现书中介绍面向对象编程时用结构体去实现类和类的继承,正好前段时间也在学习C++的基础语法,反向思维去理解面向对象也挺有意思的,所以做一下笔记。

下面文章虽然实现了类,但和C++里面的还是有很大不同的,但是在日常写代码使用这种方式的话可以让代码更加的紧凑。

类的实现

使用结构体方式声明一个Queue类,类里面有对应的成员,成员方法使用函数指针方式进行封装,将其单独放到queue.h里面。

#define QUEUE_SIZE 10
typedef struct Queue Queue;
//Queue类
struct Queue
{
    int buffer[QUEUE_SIZE]; //队列大小
    int head;//队头
    int size;//元素数量
    int tail;//队尾
    int (*isFull)(Queue * const me);//判断是否队满
    int (*isEmpty)(Queue * const me);//判断是否队空
    int (*getSize)(Queue * const me);//获取当前元素个数
    void (*insert)(Queue * const me,int k);//插入数据
    int (*remove)(Queue * const me);//删除数据
};

//构造函数和析构函数
void Queue_Init(Queue *const me,int (*isFullfunction)(Queue * const me),
    int (*isEmptyfunction)(Queue * const me),
    int (*getSizefunction)(Queue * const me),
    void (*insertfunction)(Queue * const me,int k),
    int (*removefunction)(Queue * const me));
void Queue_Cleanup(Queue *const me);

//Queue类的成员函数
int Queue_isFull(Queue * const me);
int Queue_isEmpty(Queue * const me);
int Queue_getSize(Queue * const me);
void Queue_insert(Queue * const me,int k);
int Queue_remove(Queue * const me);

//创建类对象和删除
Queue * Queue_Create(void);
void Queue_Destory(Queue * const me);

 Queue类的成员函数实现过程放在queue.c里面

#include "queue.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

void Queue_Init(Queue *const me,int (*isFullfunction)(Queue * const me),
    int (*isEmptyfunction)(Queue * const me),
    int (*getSizefunction)(Queue * const me),
    void (*insertfunction)(Queue * const me,int k),
    int (*removefunction)(Queue * const me))
{
    printf("Queue构造函数\r\n");
    me->head = 0;
    me->tail = 0;
    me->size = 0;
    me->isFull = isFullfunction;
    me->isEmpty = isEmptyfunction;
    me->getSize = getSizefunction;
    me->insert = insertfunction;
    me->remove = removefunction;
}

void Queue_Cleanup(Queue *const me)
{
    printf("Queue析构函数\r\n");
}

int Queue_isFull(Queue * const me)
{
    return ((me->head+1) % QUEUE_SIZE == me->tail);
}

int Queue_isEmpty(Queue * const me)
{
    return me->tail == me->head;
}

int Queue_getSize(Queue * const me)
{
    return me->size; 
}

void Queue_insert(Queue * const me,int k)
{
    if(!me->isFull(me))
    {
        me->buffer[me->head] = k;
        me->head = (me->head+1)%QUEUE_SIZE;
        ++me->size;
    }
}

int Queue_remove(Queue * const me)
{
    int value = 9999;
    if(!me->isEmpty(me))
    {
        value = me->buffer[me->tail];
        me->tail = (me->tail+1) % QUEUE_SIZE;
        --me->size;
    }
    return value;
}

Queue * Queue_Create(void)
{
    Queue* me= malloc(sizeof(Queue));
    if(me != NULL)
    {
        Queue_Init(me,Queue_isFull,Queue_isEmpty,Queue_getSize,Queue_insert,Queue_remove);
    }
    return me;
}

void  Queue_Destory(Queue * const me)
{
    if(me != NULL)
    {
        Queue_Cleanup(me);
    }
    free(me);
}

在main.c实例化一个Queue对象进行队列的使用,书中例子往队列里面插入元素,再逐一进行删除

#include "queue.h"
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int j,k,h,t;
    Queue * myQ = Queue_Create();
    k = 1000;
    
    for(j=0;j<QUEUE_SIZE;j++)
    {
        h = myQ->head;
        myQ->insert(myQ,k);
        printf("intserting %d ,at position %d, size %d\r\n",k--,h,myQ->getSize(myQ));
    }

    printf("\r\nintserting len:%d\r\n\r\n",myQ->getSize(myQ));

    for(j=0;j<QUEUE_SIZE;j++)
    {
        h = myQ->tail;
        k = myQ->remove(myQ);
        printf("removeting %d ,at position %d, size %d\r\n",k,h,myQ->getSize(myQ));
    } 

    printf("\r\removeting len:%d\r\n",myQ->getSize(myQ));  
    Queue_Destory(myQ);
}

最后,在gcc编译结果如下: 

分析结果符合先进先出的队列数据结构特性,但是在插入第10个元素是没有成功的,导致后面删除第10个元素也是失败的,不知道是书的作者写错还是本人理解的错误。

总结

虽然说教科书把C语言定义为面向过程语言,C++定义为面对象语言,但是更多时候阅读开源的项目代码时,还是可以看到使用C语言去实现面向对象的开发。

备注:上述的例子来自于书籍《C嵌入式编程设计模式》,如有侵权联系删除,下附书本目录:

 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值