C 语言使用结构体写面向对象代码

目录

背景:

前提:

结构体中模仿C++类:

结构体中结构体数据:

结构体中的函数的实现函数:

主函数:

结果:


背景:

在上大学的时候,我记得在那个公众号里看到关于C语言和C++的。影响中说C语言是面向过程的C++是面向对象的。但是这不是绝对的,面向对象是一种思想。要是使用C语言也是可以写出跟C++一样的面向对象的代码。

然后就是用C语言写了一个demo当时由于学的不是很精,就没看懂,这事也就过去了。就在前几天,忘了看那本说来着,里面有关函数指针的分析(C++思想还是代码大全来着,这两天就看这个了)。今天在完成一个功能编译代码的过程时闲来无事就想起使用C语言来模仿C++类的想法。

结果还正的实现了。虽然跟真正的C++类有区别,但是我觉得本质上确实是使用C语言写出了面向对象的代码。当时继承和虚函数目前还没有想到怎么实现,但是基本成员函数和类函数想到了。

前提:

本次代码是全程使用C语言,不涉及任何C++代码,包括输入输出,还有内存管理,没有使用new而是使用malloc函数的。

C语言实现面向对象的代码主要依靠C语言中的结构体。

C语言中的结构体默认是public,没有private的。而且结构体是只能存数据或者指针的,不能在结构体里定义函数。所以这里就需要C语言的函数指针了。

结构体中模仿C++类:

typedef struct StrClass
{	
	pStrD psd;
	void (*RuntimeFun1)(int a,int b,pStrD psd);
	void(*print)();
}*pSrt,Srt;

使用C语言定义成员函数都是函数指针。

结构体中的数据是另外一个结构体,因为结构体里不能定义结构体,不像类中可以定义类实现类中类。

结构体中结构体数据:

typedef struct StrData
{
	int m_error;
}*pStrD,StrD;

然后就是实现结构体中的函数了。

这些函数就是定义普通函数就行:

结构体中的函数的实现函数:

void RunFun1(int a, int b,pStrD psd)
{
	psd->m_error = a + b;
}
void print(pStrD psd)
{
	printf("m_error = %d", psd->m_error);
}

然后在实例化结构体的时候把这两个函数的指针赋值给结构体。

主函数:

int main()
{
	pSrt ps = (pSrt)malloc(sizeof(Srt));
	//pStrD psd = (pStrD)malloc(sizeof(StrD));
	ps->psd = (pStrD)malloc(sizeof(StrD));
	ps->RuntimeFun1 = &RunFun1;
	ps->print = &print;
	int a = 0, b = 0;
	scanf("%d", &a);
	scanf("%d", &b);
	ps->RuntimeFun1(a,b,ps->psd);
	ps->print(ps->psd);
	free(ps->psd);
	free(ps);	
	return 0;
	
}

这样子就实现了面向对象的编程。

全部代码:

#include <stdio.h>

typedef struct StrData
{
	int m_error;
}*pStrD,StrD;
typedef struct StrClass
{	
	pStrD psd;
	void (*RuntimeFun1)(int a,int b,pStrD psd);
	void(*print)();
}*pSrt,Srt;
void RunFun1(int a, int b,pStrD psd)
{
	psd->m_error = a + b;
}
void print(pStrD psd)
{
	printf("m_error = %d", psd->m_error);
}
int main()
{
	pSrt ps = (pSrt)malloc(sizeof(Srt));
	//pStrD psd = (pStrD)malloc(sizeof(StrD));
	ps->psd = (pStrD)malloc(sizeof(StrD));
	ps->RuntimeFun1 = &RunFun1;
	ps->print = &print;
	int a = 0, b = 0;
	scanf("%d", &a);
	scanf("%d", &b);
	ps->RuntimeFun1(a,b,ps->psd);
	ps->print(ps->psd);
	free(ps->psd);
	free(ps);	
	return 0;
	
}

结果:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

波雅_汉库克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值