用c 语言实现面向对象编程

上传人:简****9 文档编号:95808089 上传时间:2019-08-22 格式:PDF 页数:7 大小:102.87KB
返回 下载 相关 举报
用c 语言实现面向对象编程_第1页
第1页 / 共7页
用c 语言实现面向对象编程_第2页
第2页 / 共7页
用c 语言实现面向对象编程_第3页
第3页 / 共7页
用c 语言实现面向对象编程_第4页
第4页 / 共7页
用c 语言实现面向对象编程_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《用c 语言实现面向对象编程》由会员分享,可在线阅读,更多相关《用c 语言实现面向对象编程(7页珍藏版)》请在金锄头文库上搜索。

1、 1 用用 C 语言实现面向对象编程语言实现面向对象编程 (合肥工业大学 潘秀才) 我曾经在嵌入式控制系统工作过,苦于嵌入式系统编程一直是我曾经在嵌入式控制系统工作过,苦于嵌入式系统编程一直是 C 语言,而没法用语言,而没法用 C+或其他高级或其他高级 语言的面向对象方法编程。经过研究生的学习和探索,偶然间发现高焕堂老师写语言的面向对象方法编程。经过研究生的学习和探索,偶然间发现高焕堂老师写 OOPC(面向对象(面向对象 C 编程) ,感觉不错。遗憾的是上面没有提供继承的方法。根据本人的研究,在高老师的基础上,提出一编程) ,感觉不错。遗憾的是上面没有提供继承的方法。根据本人的研究,在高老师的

2、基础上,提出一 种可行而且结构明了的继承实现方法。至此,种可行而且结构明了的继承实现方法。至此,C 的的 OO 编程中的封装、继承、多态都全实现了。现在编程中的封装、继承、多态都全实现了。现在 本人将其总结如下,希望对大家有帮助。本人将其总结如下,希望对大家有帮助。 一、类的封装实现:借用高焕堂的宏头文件,类很容易封装为如下的格式一、类的封装实现:借用高焕堂的宏头文件,类很容易封装为如下的格式 1、类的定义,其中 CLASS() 是 lw_oopc_kc.h 中定义的宏 #include “lw_oopc_kc.h“ CLASS(A) int a; void(*init)(void*,int)

3、; void(*put)(void*); ; 2、成员函数的实现 类的封装实质是用借用 struct 结构体,用函数指针来表示 C+中类的方法(成员函数) 。接下来给 类 A 的方法写实体函数。 void init_A(void *t,int x) A *cthis = (A*)t; cthis- a = x; void put_A(void*t) A *cthis = (A*)t; printf(“ %d “,cthis- a); 3、类(结构体)中的函数指针与实现函数的关联 通过下面的宏把类的方法(函数指针)和实现函数关联: CTOR(A) FUNCTION_SETTING (init,

4、init_A); FUNCTION_SETTING (put, put_A); END_CTOR PDF 文件使用 “pdfFactory Pro“ 试用版本创建 2 4、对象的定义、构造和初始化 如果没有这个连接处理,类(实际是 struct)中的函数指针就没有函数的功能。函数 init_A()是 XXX_A() 的命名模式,是指明 XXX_A()属于 A 类的函数,方便程序的理解和维护。下面就是要构造 类。在 C+中这个工作系统自动调用构造函数实现而在 C 中,这个过程智能显示调用来实现。借助 lw_oopc_kc.h (或“lw_oopc.h“)可以利用宏 CLASS_CTOR(cla

5、ss,obj)来将定义的对象进行构造,使之 有数据的同时有方法的功能。实例化一个对象 3 步子如下: A aa1; / 1、定义对象 CLASS_CTOR(A,aa1); / 2、构造对象使得函数指针和函数关联 aa1.init( / 3、初始化对象的成员变量,注意要:注意要: / 继承继承 A 类类 int b; / 子类的成员 void (*init) (void*, int x); void (*put) (void*); ; 2、子类的成员函数实现,为了方便辨别,类、子类的成员函数实现,为了方便辨别,类 B 的成员函数带后缀的成员函数带后缀 _B void init_B (void*t

6、, int x, int y) B *cthis = (B*) t; CLASS_CTOR(A, cthis- A); /- - - - 继承的基继承的基类类在在这里这里构构造造,对象是,对象是 cthis- A cthis- A.init( /- - - - 继承的基继承的基类类的的初始化初始化, 注意:注意: void put_B (void *t) B *cthis = (B*) t; cthis- A.put ( /- - - 子类调子类调用用父类父类的方式的方式 printf(“ %d “,cthis- b); /- - - 输出类成员值 PDF 文件使用 “pdfFactory P

7、ro“ 试用版本创建 3 3、子类的构造函数,和无继承类一样,将函数指针和函数关联、子类的构造函数,和无继承类一样,将函数指针和函数关联 CTOR(B) FUNCTION_SETTING (init, init_B); /- - - 函数指针和函数关联的宏 FUNCTION_SETTING (put, put_B); END_CTOR 说明:对基类的构造,不能在子类的构造宏 CTOR(B) 和 END_CTOR 之间进行,因为那时候子类 B 没有实例化,故没有实体对象,CLASS_CTOR(A, cthis- A);不能放在里面,不能放在里面,只好放在 init_B() 函数里面,因为那时候

8、 B 类已经有实例化对象了。这样的做法与 C+的做法不一样。C+在构造 B 的对象时,先调用 A 类的构造函数实例化对象中的基类部分。下面为 main()函数的调用处理: int main() A aa1; B b; CLASS_CTOR(A,aa1); /- - 构造 aa1 对象 aa1.init( /- - 初始化 aa1 对象 aa1.put( /- - 调用 aa1 对象的成员函数 CLASS_CTOR(B, b); /- - - 构造 b 对象 b.init( /- - 初始化 b 对象,包括包括基基类类 A 的构的构造造和和初始化初始化 b.put( /- - 调用 b 对象成员

9、函数 b.A.put( /- - 调调用用 b 对象的基对象的基类成员函数类成员函数 return 0; 输出结果为:5 100 78 100 三、多态的实现:三、多态的实现:多态,简而言之即一个接口,多种实现。也就是用相同的抽象类的代码实现不同 的功能。在 C 中多态的实现是通过接口来实现的。借用 lw_oopc.h 宏文件,设计一个计算的多态 例子如下: 1、接口的定义:本例是实现加法、减法运算。加和减都是调用类的同一个成员函数,却分别实现、接口的定义:本例是实现加法、减法运算。加和减都是调用类的同一个成员函数,却分别实现 了加、减的功能。本例的接口表示获得计算结果,但不知道采样什么样的计

10、算方法。了加、减的功能。本例的接口表示获得计算结果,但不知道采样什么样的计算方法。 /* operater.h */ #ifndef OPER_H #define OPER_H INTERFACE(IOPERATOR) double (*GetResult)(double,double); ; #endif /*- - - - - - - - - - - - - end of operater.h - - - - - - - - - - - - - - - - - - */ PDF 文件使用 “pdfFactory Pro“ 试用版本创建 4 2、 在加法类在加法类 Add 中实现接口中实现

11、接口 IOPERATOR /* Add.C */ #include “lw_oopc_kc.h“ #include“operater.h“ / 头文件顺序很重要,lw_oopc_kc.h 在前,原因很简单不解释 #include “classes.h“ /* 类类 Add 定义定义在在 classes.h 中中 CLASS(Add) IMPLEMENTS(IOPERATOR); ;*/ static double GetResult(double a,double b) return (a+b); CTOR(Add) FUNCTION_SETTING(IOPERATOR.GetResult,G

12、etResult); END_CTOR /*- - - - - END OF ADD.C- - - - - */ 3、 在减法类在减法类 Sub 中实现接口中实现接口 IOPERATOR /*- - - Sub.c - - - */ #include “lw_oopc_kc.h“ #include“operater.h“ #include “classes.h“ /*类类 Sub 定义定义在在 classes.h 中中 CLASS(Sub) IMPLEMENTS(IOPERATOR); ;*/ static double GetResult(double a,double b) return

13、(a- b); CTOR(Sub) FUNCTION_SETTING(IOPERATOR.GetResult,GetResult); END_CTOR /*- - - - - END OF Sub.C- - - - - */ PDF 文件使用 “pdfFactory Pro“ 试用版本创建 5 4、 组合,把组合,把 operater.h、Add.C、Sub.C 和 main.C 组成一个工程,组成一个工程,main.c 文件如下文件如下: /*- - - main.c - - - */ #include #include “lw_oopc_kc.h“ #include“operater.h

14、“ / 头文件顺序很讲究,lw_oopc_kc.h 必须在前面 #include “classes.h“ int main() int a = 10, b=5; int c1,c2; IOPERATOR *poper; /- - 定义接口指针,用指针实现多态 Add A; /- - - 对象 A 成员函数实现加法 Sub S; /- - - 对象 B 成员函数实现减法 CLASS_CTOR(Add, A); CLASS_CTOR(Sub, S); /- - - 静态内存处理方法 poper = /也可以动态内存方法:oper = New(Add); 记得 free() c1 = (poper-

15、 GetResult(a,b); / c1 的结果 = 15 ( a+b) poper = c2 = poper- GetResult(a,b); / c2 结果= 5 (a- b) return 0; /*- - - - - END OF main.C- - - - - */ 总结:总结: 1、在、在 lw_oopc_kc.h 的基础上,为了增加可理解性,不改变原作含义为前提下,增加了以下宏的基础上,为了增加可理解性,不改变原作含义为前提下,增加了以下宏 #define CLASS_CTOR(Class,obj) Class#Setting( struct type #ifndef LW_OOPC_PURE_STATIC #ifndef LW_OOPC_STATIC #ifndef LW_OOPC_DYNAMIC #define CTOR(type) void* type#Setting(type*); void* type#New() struct type *t; t = (struct type *)malloc(sizeof(struct type); r

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号