一种c语言利用面向对象思想编程示例

以下这段C语言代码体现了一种模拟面向对象编程思想的方式。在C++等真正的面向对象编程语言中,可以使用类(class)和对象(object)来直接实现封装、继承和多态等特性。然而在C语言中,由于没有内置的面向对象机制,程序员通常通过结构体(struct)结合函数指针的方式来模拟面向对象设计。

在这段代码中:

  • Queue_Pro 结构体代表了队列这一"对象"的属性(数据成员)。
  • Queue_Ops 结构体则扮演了方法集的角色,它包含了一系列指向操作队列相关功能的函数指针,模拟了面向对象中的方法或者成员函数。

当需要对队列进行操作时,通过调用queue_Ops中的函数指针来间接执行相应的操作,这样就实现了类似于面向对象中的消息传递机制------即通过对象调用其方法。

整体上看,尽管C语言本身不支持面向对象编程,但通过这种巧妙的设计和组织方式,可以在一定程度上实现面向对象编程的设计思路和优点,如封装性、模块化等。

首先给出代码:

queue.h

复制代码
#ifndef _QUEUE_H_
#define _QUEUE_H_

#include <stdint.h>
/* 对象变量 */
typedef struct
{
    int32_t capacity;  //队列容量
    int32_t head;
    int32_t tail;
    int32_t size;  //队列缓存长度

} Queue_Pro;

/* 对象方法 */
typedef struct
{
    void (*Create)(Queue_Pro *self,uint32_t size);  //创建 初始化
    int8_t (*Enqueue)(Queue_Pro *self);  //进队列
    int8_t (*Dequeue)( Queue_Pro *self);  //出队列
    void (*SetEmpty)( Queue_Pro *self);   //清空
    int8_t (*IsEmpty)( Queue_Pro *self);  //

} Queue_Ops;

extern const Queue_Ops queue_Ops;




#endif

queue.c

复制代码
#include "queue.h"

static void Create(Queue_Pro *self, uint32_t size)
{
    self->capacity = size;
    self->head = 0;
    self->tail = 0;
    self->size =0;
}

static int8_t Enqueue(Queue_Pro *self)
{
    if (self->size == self->capacity) {
        // printf("队列已满,无法入队\n");
        return 0;
    }
    if (self->tail >= self->capacity)
        self->tail = 0;
    self->size++;

    return 1;
}

static int8_t Dequeue(Queue_Pro *self)
{
    if (self->size == 0) {
        // printf("队列为空,无法出队\n");
        return 0;
    }
    if (self->head >= self->capacity)
        self->head = 0;
    self->size--;

    return 1;
}

static void SetEmpty(Queue_Pro *self)
{
    self->head = 0;
    self->tail = 0;
    self->size = 0;
}

static int8_t IsEmpty(Queue_Pro *self)
{
    return (self->size == 0);
}

const Queue_Ops queue_Ops = {
    .Create = &Create,
    .Enqueue = &Enqueue,
    .Dequeue = &Dequeue,
    .SetEmpty = &SetEmpty,
    .IsEmpty = &IsEmpty
};

main.c

复制代码
#include "queue.h"

#define DATALEN 100

void main(void)
{
    uint8_t getvalue;
    Queue_Pro queue;
    uint8_t  databuf[DATALEN];
    queue_Ops.Create(&queue,DATALEN);

    /* 入队列 */

    if(queue_Ops.Enqueue(&queue))
    {
        databuf[queue.tail++] = 10;
    }

     if(queue_Ops.Enqueue(&queue))
    {
        databuf[queue.tail++] = 20;
    }

     if(queue_Ops.Enqueue(&queue))
    {
        databuf[queue.tail++] = 30;
    }

    /* 出队列 */

    if(queue_Ops.Dequeue(&queue))
    {
        getvalue=databuf[queue.head++];
    }

     if(queue_Ops.Dequeue(&queue))
    {
        getvalue=databuf[queue.head++];
    }

     if(queue_Ops.Dequeue(&queue))
    {
        getvalue=databuf[queue.head++];
    }
    

}

在C语言中实现的一个简单循环队列(Circular Queue)数据结构,该结构包括头文件定义、方法实现以及主函数调用。以下是各部分的具体说明:

头文件(queue.h) 在头文件中,首先定义了两个核心结构体类型:

  1. Queue_Pro: 表示队列对象本身,其中包含了队列的核心属性:

    • 容量(capacity): 存储队列的最大元素数量。
    • 头指针(head): 指向队列头部的索引。
    • 尾指针(tail): 指向队列尾部即将插入新元素的位置。
    • 当前队列缓存长度(size): 记录当前队列中元素的数量。
  2. Queue_Ops: 作为一个函数指针集合,封装了对队列进行的各种操作,如创建队列、入队、出队、清空队列和判断队列是否为空等。

最后,在头文件中声明了一个外部引用常量queue_Ops,它将指向这些操作的具体实现函数。

方法实现 这部分实现了在头文件中声明的所有队列操作函数:

  • Create: 初始化队列,设置其容量,并将头指针、尾指针初始化为0,同时将当前队列大小设为0。

  • Enqueue: 实现入队操作,检查队列是否已满,若未满,则执行入队动作,更新尾指针和队列大小。

  • Dequeue: 实现出队操作,检查队列是否为空,若非空,则执行出队动作,更新头指针并减少队列大小。

  • SetEmpty: 清空队列,将头指针、尾指针重置为0,并将队列大小设为0。

  • IsEmpty: 判断队列是否为空,返回一个布尔值表示结果。

全局变量声明与初始化 这部分将上述定义的方法绑定到queue_Ops结构体实例上,这样可以通过该实例方便地调用对应的操作函数。

主函数main() 在主函数中:

  1. 首先定义了一个队列实例queue,并分配了一个名为databuf的数据缓冲区用于存放队列中的数据元素。

  2. 调用queue_Ops.Create(&queue, DATALEN)以创建一个容量为DATALEN的队列。

  3. 接着,连续执行三次入队操作,分别将数值10、20、30放入队列,通过databuf[queue.tail++]存储实际数据。

  4. 然后同样执行三次出队操作,每次成功出队后从databuf[queue.head++]取出数据并存放在变量getvalue中。

相关推荐
东华万里21 分钟前
第十五讲 指针 从本质吃透 C 语言指针(上)
c语言·开发语言
Logic10142 分钟前
深入理解C语言if语句的汇编实现原理:从条件判断到底层跳转
c语言·汇编语言·逆向工程·底层原理·条件跳转·编译器原理·x86汇编
恶魔泡泡糖1 小时前
最小系统组成部分
c语言·单片机
iCxhust1 小时前
8088单板机C语言汇编混合编程实验方法与步骤
c语言·汇编·单片机·嵌入式硬件·微机原理
雨落在了我的手上2 小时前
C语言入门(二十八):动态内存管理(2)
c语言·开发语言
小龙报2 小时前
【算法通关指南:基础算法篇】高精度专题:一篇破除超数运算问题
c语言·数据结构·c++·算法·链表·贪心算法·visual studio
Yupureki2 小时前
《算法竞赛从入门到国奖》算法基础:入门篇-双指针
c语言·开发语言·数据结构·c++·算法·visual studio
努力努力再努力wz3 小时前
【Linux网络系列】:网络+网络编程(UDPsocket+TCPsocket)
java·linux·c语言·开发语言·数据结构·c++·centos
Trouvaille ~4 小时前
【LInux】进程程序替换与shell实现:从fork到exec的完整闭环
linux·运维·c语言·c++·ssh·进程替换·基础入门
SETH·XU4 小时前
简记:关于net-snmp中engineid冲突全局etimelist的赋值情况
c语言·网络·net-snmp·snmpv3·engineid冲突