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

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。