首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言的面向对象编程

面向对象编程是一种思想,并非一定要用哪种语言去实现,c语言也可以实现面向对象编程。通过结构体和指针就可以实现。

C语言实现各部分功能

面向对象主要的有封装、继承、多态。下面说下如何用C语言实现。

封装

封装的作用是减少对外的接口

typedef struct {

UART_X_Information UART_X; //

uint16_t data_num;

uint8_t *receive_data;

uint32_t EventValue;

UART_HandleTypeDef huart;

uint8_t (*frame_data);

uint32_t frame_num;

uint32_t frame_num_all;

uint8_t send_num;

struct UARTTable *vptr; // 虚表指针

} UART_X_MIX;

struct UARTTable{

uint8_t* (*UARTx_Rx)(UART_X_MIX *this); // 虚函数指针

uint32_t (*UARTx_Tx)(UART_X_MIX *this); // 虚函数指针 发送串口数据

uint32_t (*UARTx_Tx_Frame)(UART_X_MIX *this); // 虚函数指针 组帧数据

};

如以上代码,包含要使用到的参数,和一个指向包含函数指针的结构体,其中的函数均使用结构体中的内容作为参数。这样就减少了与外部的联系,尽量做到高内聚、低耦合。

继承

继承用于扩展,比如要在之前的功能上增加新的东西,就可以新定义一个结构体,新的结构体包含老的结构体

typedef struct {

UART_X_MIX UART_X_MIX; //

uint16_t test;

struct test *vptr2; // 虚表指针

} UART_X_MIX_test;

struct test {

uint8_t* (*test1)(UART_X_MIX_test*this); // 虚函数指针

};

这样就可以使用上一级节点的功能(父节点)。

多态

多态是根据使用要求的不一样,动态实现不同功能。具体的实现是对上述的虚表指针(struct UARTTable *vptr)赋予不同的地址(不同函数)。这样就实现了动态变化功能。

整体编程思路

1 定义一个包含所需变量和虚表指针(可以为函数指针,或者包含函数指针的结构体)的结构体。

typedef struct {

uint8_t send_num;

...

struct UARTTable *vptr; // 虚表指针

} UART_X_MIX;

struct UARTTable{

uint8_t* (*UARTx_Rx)(UART_X_MIX *this); // 虚函数指针

...

};

2 编写结构体赋值函数

uint8_t *UARTx_Rx(UART_X_MIX * this)

{

...

}

void UART1_TX_INIT(UART_X_MIX *this,send_num)

{

static struct UARTTable UARTTable = ;

// 让虚表指针指向上面这个虚表

this->send_num= send_num;

this->vptr = &UARTTable;

}

使用UART6_TX_INIT()函数对结构体赋值

3 结构体赋值,运行函数

UART1_X_INIT(&UART1_X_MIX,send_num);

UART1_X_MIX.vptr->UARTx_Rx(&UART1_X_MIX);

先给结构体赋值,然后运行函数。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230104A01X3A00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券