最近在看《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嵌入式编程设计模式》,如有侵权联系删除,下附书本目录: