本帖最后由 与龙共舞 于 2018-5-3 11:01 编辑
最近到物联网公司,看到一份吊炸天的工程代码。说一下强烈的面向对象风格。
- #include<stdio.h>
-
- int fjia(int a,int b)
- {
- return a+b;
- }
- int fjian(int a,int b)
- {
- return a-b;
- }
- typedef struct
- {
- int a;
- int b;
- }Var;
- typedef struct
- {
- int (*jia) (int x,int y);
- int (*jian)(int x,int y);
- }Const;
- typedef struct
- {
- Const *TKConst;
- Var *TKVar;
- }_Handle , *Handle;
- void main()
- {
- Const AA={.jia=&fjia,.jian=&fjian};
- Var aa={3,2};
- _Handle H1={.TKConst=&AA,.TKVar=&aa};
- Handle H2=&H1;
- printf("%d\n",H1.TKVar->a);
- printf("%d\n",H1.TKVar->b);
- printf("%d\n",H1.TKConst->jia(2,3));
- printf("%d\n",H1.TKConst->jian(2,3));
- printf("%d\n",H2->TKVar->a);
- printf("%d\n",H2->TKVar->b);
- printf("%d\n",H2->TKConst->jia(2,3));
- printf("%d\n",H2->TKConst->jian(2,3));
- printf("%d\n",AA.jia(3,3));
- printf("hello GKoSon\n");
- }
复制代码
看上去是不是很犀利。数据+函数=类。
维度下降一点:
- #include<stdio.h>
-
- typedef struct
- {
- int (*jia) (int x,int y);
- int (*jian)(int x,int y);
- }Const;
- int fjia(int a,int b)
- {
- return a+b;
- }
- int fjian(int a,int b)
- {
- return a-b;
- }
- void main()
- {
- Const A;
- A.jia=fjia;
- A.jian=fjian;
- printf("%d\n",A.jia(1,3));
- printf("hello GKoSon\n");
- }
- ++++++++++++++++
- void main()
- {
- Const A={&fjia,&fjian};
- printf("%d\n",A.jia(6,3));
- printf("hello GKoSon\n");
- }
- +++++++++++++++++
- void main()
- {
- Const A={.jia=&fjia,.jian=&fjian};
- printf("%d\n",A.jia(3,3));
- printf("hello GKoSon\n");
- }
复制代码 上面的常用的地方是函数指针,改变功能。类似的是宏开关了。
再来:
- 第三部struct和class直接只差一个typedef
- #include<stdio.h>
- typedef int (*pfun) (int a,int b); //
- typedef struct
- {
- int a;
- int b;
- pfun f;
- }A;
- int Val(int a,int b)
- {
- return a+b;
- }
- void main()
- {
- A data;
- data.a=2;
- data.b=4;
- data.f=Val;
- printf("%d\n",data.f(data.a,data.b));
- printf("hello GKoSon\n");
- }
- 优化一下
- #include<stdio.h>
- typedef int (*pfun) (int a,int b);
- typedef struct
- {
- int a;
- int b;
- pfun f;
- }A;
- int Val(int a,int b)
- {
- return a+b;
- }
- void main()
- {
- A data={2,3,&Val};//&Val Val
- printf("%d\n",data.f(data.a,data.b));
- printf("hello GKoSon\n");
- }
复制代码 上面的是我本人推荐的方法。
来个基本的:
- 第2部:函数指针出厂
- #include<stdio.h>
- typedef struct
- {
- int a;
- int b;
- }A;
- int Val(int a,int b)
- {
- return a+b;
- }
- void main()
- {
- A data;
- int (*f) (int a,int b);
- data.a=2;
- data.b=4;
- f=Val;
- printf("%d\n",f(data.a,data.b));
- printf("hello GKoSon\n");
- }
复制代码
好了 最后基本的吧
- #include<stdio.h>
- typedef struct
- {
- int a;
- int b;
- }A;
- int Val(int a,int b)
- {
- return a+b;
- }
- void main()
- {
- A data;
- data.a=2;
- data.b=4;
- printf("%d\n",Val(data.a,data.b));
- printf("hello GKoSon\n");
- }
复制代码 参考:一步步写操作系统 使用C语言的struct来实现C++的class
http://blog.csdn.net/stophin/article/details/78385239
|
这不就是几个函数指针吗?
C的结构体成员里面增加函数指针和面向对象的类,差不多
上位机代码里面的重载,C也可以实现