目录
背景:
在上大学的时候,我记得在那个公众号里看到关于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;
}
结果: