【UML+OOPC嵌入式C语言开发】使用C语言实现一个面向对象语言才能够实现的类
创始人
2024-05-28 15:12:37
0

文章目录

  • 简述OOPC
  • 开发环境
  • 知识讲解
  • 函数示例
    • 类的实现示例
    • 接口实现示例

(前面两部分有点无聊,如果大家没兴趣看可以直接从知识讲解开始看


简述OOPC

  oopc,是一种轻量级的面向对象的C语言编程框架, LW_OOPC是Light-Weight Object-Oriented Programming in(with) C的缩写,总共一个.h文件, 20个宏, 约130行代码, 非常的轻量级, 但却很好的支持了很多面向对象的特性, 比如继承, 多态。 可以优美的实现面向接口编程。 这个框架是由台湾的高焕堂先生以及他的MISOO团队首创。


开发环境

  • 采用vscode为IDE
  • 使用makefile编写编译规则
  • 使用GCC编译器

  这里vscode的作用主要是编辑,哈哈哈。至于使用makefile编写编译规则,它既可以减少不必要的编译次数(文件数量较少体现不出),也解决了博主在vscode的同一个项目中,无法同时编译多个.c文件,总之,非常好用。😅🤣


知识讲解

面向对象语言开发特性:

  • 封装:根据职责将属性和方法封装到一个抽象的类中;
  • 继承:实现代码的重用,相同的代码不需要重复的写;
  • 多态:以封装和继承为前提,不同的子类对象调用相同的方法,产生不同的执行结果;

函数指针
  指针,形象化地来说就是一个指向一个空间的地址,也就是通过这个指针可以访问这个地址存储的内容。
  函数指针,是一个函数经过编译后,计算机会给它分配一段存储空间,而函数指针实际上是指向这段存储空间首地址的一个指针。 那么其函数名就表示函数的指针,代表了函数的起始地址。
  函数指针格式为 类型名 (*指针变量名) (函数参数列表),这里的类型名也可以理解为函数返回值的类型。
  例如:

  • 一个不带参数的函数指针可以表示为:void (*pFun) (void);
  • 一个带1个参数的函数指针可以表示为:void (*pFun) (int);
  • 一个带1个参数并且有返回值的函数指针可以表示为:int (*pFun) (int);

  当需要指向一个函数时,需要定义一个返回值、函数参数个数类型一致的函数,例如:

#include "stdio.h"
void fun(void)
{printf("this is fun\n");
}int main(void)
{void (*p) (void);p = fun;(*p)();return 0;
}

  其运行结果为:
在这里插入图片描述




那么一起来看看oopc是如何是如何进行面向对象开发的吧!🤤🤤🤤

关键字CLASS
  oopc中,一个类实际上是通过一个结构体实现。伪关键字CLASS实际上是通过define重新声明得到,实际上其定义为#define CLASS(type) typedef struct type type。(将其称为伪关键字是因为:在面向对语言中其确实是一个关键字,如java、python等确实有关键字class,而oopc的CLASS是通过声明得到,并不是C语言实际存在的关键字。)
  例如,定义一个类A:

// 类
CLASS (A)
{···// 属性及方法
};

关键字IMPLEMENTS
  implements关键字,在面向对象语言中,是继承一个接口比不可少的关键字(这里指java语言)。其实在基于oopc的C语言开发中,也是类似的。
  在oopc中,关键字IMPLEMENTS本质也是一个结构体,只不过就是将一个结构体变量名重新声明成IMPLEMENTS了,其声明为#define IMPLEMENTS(type) struct type type。(IMPLEMENTS也是一个伪关键字)
  明白了类的实现,接口的实现也就简单了,因为两者的本质都是结构体嘛。其实现为:

// 接口
INTERFACE (base)
{···// 接口的属性及方法
};

构造器CTOR
  在oopc中,构造器CTOR是一个非常重要的玩意。
  在oopc程序中,设计类是一件重要的工作,其目的是借之产生对象。“构造器”(Constructor)函数,可称之为“对象之母”,它能够依照类的定义产生对象。
  构造器CTOR在lw_oopc.h文件中的声明为:

#define CTOR(type)                                      \type* type##_new() {                                \struct type *cthis;                                 \cthis = (struct type*)malloc(sizeof(struct type));  \if(!cthis)                                          \{                                                   \return 0;                                       \}                                                   \type##_ctor(cthis);                                 \return cthis;                                       \
}

  不难看出:CTOR构造器的主要功能为,使用malloc函数分配内存空间给所声明的对象
  使用示例:

在头文件中使用

	// 类的声明class (A){void (*fun) (void);}// 外部声明extern A* A_new();

在.c文件中使用

	// 类的方法static void testFun(void){printf("this is a fun");}// 使用构造器构造类CTOR (A)FUNCTION_SETTING(fun,testFun);END_CTOR	

  在这里需要注意:外部声明函数extern A* A_new();声明时一定要使用类的名字,否则会出现报错。(这个声明可加可不加,网上也有很多帖子是使用ANew()来声明一个类的,可能是其修改了lw_oopc.h文件中的声明吧。)


函数示例

类的实现示例

main.c文件

#include 
#include "light.h"
#include "lw_oopc.h"
void main(void)
{printf("class light test\n");Light*n = (Light*)Light_new();n->init(n);printf("light state:%d\n",n->getState(n));n->setState(n,1);printf("new light state:%d\n",n->getState(n));
}

light.c文件

#include "light.h"
#include "stdio.h"
#include "lw_oopc.h"// 灯类的初始化
static void lightInit(void *light)
{Light*pthis = (Light*)light;pthis->state = 0;
}// 获取灯的状态
static int getLightState(void *light)
{Light*pthis = (Light*)light;return pthis->state;
}// 设置灯的状态
static void setLightState(void *light,int newState)
{Light*pthis = (Light*)light;pthis->state = newState;
}// 构造器  分配空间给类
CTOR (Light)FUNCTION_SETTING(init,lightInit);FUNCTION_SETTING(getState,getLightState);FUNCTION_SETTING(setState,setLightState);
END_CTOR

light.h文件

#ifndef  _LIGHT_H
#define  _LIGHT_H#include "lw_oopc.h"CLASS (Light)
{int state;void (*init) (void*);int (*getState) (void*);void (*setState) (void*,int newState);
};// 相当于重新new一个灯类
extern Light* Light_new();#endif // _DATA_H

vscode运行结果
在这里插入图片描述

接口实现示例

main.c文件

#include 
#include "lw_oopc.h"
#include "myInterface.h"// 接口测试
void main(void)
{// 圆类的实现circle*c = (circle*)circle_new();c->baseShape.init(c,"circle");c->baseShape.draw(c);c->vMove(c);// 正方形类的实现square* s = square_new();s->baseShape.init(s,"square1");s->baseShape.draw(s);s->vMove(s);
}

myInterface.h文件

#ifndef _MYINTERFACE_H
#define _MYINTERFACE_H#include "lw_oopc.h"// 接口
INTERFACE (baseShape)
{char name[10];void (*init) (void*,char*);void (*draw) (void*);
};// 圆类
CLASS (circle)
{IMPLEMENTS (baseShape);void (*vMove) (void*);
};
extern circle* circle_new();// 正方形类
CLASS (square)
{IMPLEMENTS (baseShape);void (*vMove) (void*);
};
extern square* square_new();#endif //_MYINTERFACE_H

myInterface.c文件

#include "myInterface.h"
#include "string.h"
#include "stdio.h" /********************圆类的实现*******************/void cinit(void*p,char*name)
{circle*pthis = (circle*)p;strcpy(pthis->baseShape.name,name);
}void cdraw(void*p)
{circle*pthis = (circle*)p;printf("%s drawing\n",pthis->baseShape.name);
}void cmove(void *p)
{circle*pthis = (circle*)p;printf("%s moving\n",pthis->baseShape.name);
}CTOR (circle)FUNCTION_SETTING(vMove,cmove);FUNCTION_SETTING(baseShape.init,cinit);FUNCTION_SETTING(baseShape.draw,cdraw);
END_CTOR/********************正方形类的实现*******************/
void sinit(void*p,char*name)
{square*pthis = (square*)p;strcpy(pthis->baseShape.name,name);
}void sdraw(void*p)
{square*pthis = (square*)p;printf("%s drawing\n",pthis->baseShape.name);
}void smove(void *p)
{square*pthis = (square*)p;printf("%s moving\n",pthis->baseShape.name);
}CTOR (square)FUNCTION_SETTING(vMove,smove);FUNCTION_SETTING(baseShape.init,sinit);FUNCTION_SETTING(baseShape.draw,sdraw);
END_CTOR

结果
在这里插入图片描述


  lw_oopc相关的文件大家可以去gitee或者是github上面找找,上面有很多示例,博主还没完全码明白。oopc相关文件的示例仓库😅😅😅



小编会持续更新的哟!欢迎大家点赞+收藏+关注!!!🤤🤤🤤

相关内容

热门资讯

A股分红派息转增一览:6股今日... 每经AI快讯,Wind数据显示,根据上市公司权益分配方案梳理统计,6只A股今日股权登记。其中,4股拟...
特朗普拟对进口电影征100%关... 来源:央视新闻客户端美国总统特朗普当地时间5月4日称,对所有进入美国、在外国制作的电影征收100%关...
云创数据积极应对挑战,加速推进... 去年云创数据的研发支出金额为3708.72万元,占营收比例达到73.58%。 ...
A股风险偏好有望回暖,5月或回... A股市场5月6日迎来5月首个交易日。回顾“五一”假期前市场表现,A股整体呈现窄幅盘整走势,小盘成长股...
以军战机猛烈空袭也门 据多家以色列媒体援引以色列安全部门消息人士的话报道称,当地时间5月4日晚,约30架以军战机千里奔袭,...
新华每日电讯:上海“绿色大民生... 浦江两岸,繁花似锦。一条“水环”串起十余座公园,浦东陆家嘴诞生户外运动新地标;国际花展展览面积创历年...
烟火升腾 全城沸腾 “五一”长... “第一次来长春,就被这里的消费氛围震撼了。晚上看灯光秀、品特色烧烤,白天逛文创集市,还能定制专属旅行...
广东农信系统加速改革 将组建农...   证券时报记者 安毅  又一省份明确农信系统改制方向。  广东省联社日前披露的2024年年报提到,...
全国首个地质生态产品概念发布 来源:矿权资源网近日,全国首个地质生态产品概念、理论内涵在浙江湖州安吉发布。  今年是“两山”理念提...
一所村级小学里的青春榜样 来源:科技日报科技日报记者 梁乐在五四青年节到来之际,中共中央总书记、国家主席、中央军委主席习近平给...
地名中的抗战记忆 | 黑龙江肇... 姚明久像  黑龙江省肇东市西北部,坐落着一个以抗日烈士之名命名的乡镇——明久乡。  姚明久参加抗联后...
中金:A股节后有望迎来“开门红... 转自:财联社【中金:A股节后有望迎来“开门红”】财联社5月6日电,中金公司研报认为,一季度A股上市企...
喜报!中国石油5名青年获国家级... 2025年度中国青年五四奖章暨新时代青年先锋奖评选结果揭晓中国石油5名青年获奖4月30日,2025年...
家务劳动大比拼 转自:湖州日报  德清县新安镇下舍中心学校日前举办“巧手做家务 劳动‘心’体验”主题活动。学生们通过...
走进沪上养老社区:“享受型”养... 转自:上观新闻如果一家养老院,拥有五星级酒店的房间设施,独立的单间和贴心的“管家”,甚至还有一步之遥...
德国联盟党与社民党签署联合执政... 转自:新华网  这是5月5日在德国柏林拍摄的德国联盟党与社民党联合执政协议签署仪式现场。新华社记者 ...
OpenAI放弃商业架构计划,... OpenAI CEO奥尔特曼在马斯克、辛顿和前OpenAI员工反对之后,如今,估值3000亿美元(约...
5月6日投资避雷针:5家公司因... 导读:财联社5月6日投资避雷针,近日,A股及海外市场潜在风险事件如下。国内经济信息方面包括:1)5月...
“五一”假期,洛阳接待游客73...   洛报融媒记者5日从洛阳市文广旅局获悉,今年“五一”假期,洛阳共接待游客736.27万人次,旅游总...
巴西警方粉碎Lady Gaga... 本报驻巴西特派记者 邵世均 本报特约记者 高文宇 本月3日,美国乐坛天后Lady Gaga在巴西里约...