Chinaunix

标题: 用 C 语言实现面向对象编程 [打印本页]

作者: goodzmq    时间: 2011-11-08 11:21
标题: 用 C 语言实现面向对象编程
一、类的封装实现:借用高焕堂的宏头文件,类很容易封装为如下的格式1、类的定义,其中 CLASS()  是 lw_oopc_kc.h 中定义的宏#include "lw_oopc_kc.h" CLASS(A)
    { int a; void(*init)(void*,int); 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, init_A); FUNCTION_SETTING (put, put_A);END_CTOR 4、对象的定义、构造和初始化如果没有这个连接处理,类(实际是 struct)中的函数指针就没有函数的功能。函数 init_A()是 XXX_A()  的命名模式,是指明 XXX_A()属于 A 类的函数,方便程序的理解和维护。下面就是要构造 类。在 C 中这个工作系统自动调用构造函数实现而在 C  中,这个过程智能显示调用来实现。借助 lw_oopc_kc.h (或"lw_oopc.h")可以利用宏 CLASS_CTOR(class,obj)来将定义的对象进行构造,使之 有数据的同时有方法的功能。实例化一个对象 3 步子如下:A   aa1;                           // 1、定义对象CLASS_CTOR(A,aa1);       // 2、构造对象—使得函数指针和函数关联aa1.init(&aa1, 10);               // 3、初始化对象的成员变量,注意要: &aa1(取地址)
    二、C 继承的实现:1、子类的定义:在类的开头借用已经定义的类进行定义一个变量,为了更加明白,表明是继承,增加一个宏定义:#define INHERIT(BASE)    IMPLEMENTS(BASE)
    于是以类 B 继承类 A 为例子如下:CLASS(B)
    { INHERIT(A);              //  继承 A 类 int b;                                   //  子类的成员 void (*init) (void*, int x);void (*put) (void*);};2、子类的成员函数实现,为了方便辨别,类 B 的成员函数带后缀 ‘_B’void init_B (void*t, int x, int y)
    { B *cthis =   (B*) t;CLASS_CTOR(A, cthis->A);               //——继承的基类在这里构造,对象是 cthis->A cthis->A.init(&cthis->A, x);                //——</SPA< div>
此文出自:中国IT实验室之软件月刊
作者: 狗气球    时间: 2011-11-08 12:32
这是何苦
作者: MMMIX    时间: 2011-11-08 12:34
这是何苦
狗气球 发表于 2011-11-08 12:32



    这是广告,而且是不合格的广告。
作者: fender0107401    时间: 2011-11-08 12:36

作者: file3    时间: 2011-11-08 17:50
從 OOC 抄出來的?
作者: liaoliaofannao    时间: 2011-11-10 16:44
貌似看不懂这个 呵呵
作者: zylthinking    时间: 2011-11-10 17:02

作者: 群雄逐鹿中原    时间: 2011-11-10 18:14
不如OIOIC啊
作者: 幻の上帝    时间: 2011-11-10 18:28
弱爆了,看来真不如OIOIC。。
话说在贴吧这种广告好像也没乱掉,为什么到这里格式就这么奇葩了?
作者: sep    时间: 2011-11-10 19:33
他以为他是文艺程序员,结果成了2B程序员
作者: digdeep126    时间: 2011-11-10 20:29
这就没有那个必要了吧!
作者: gtkmm    时间: 2011-11-12 04:17
用C实现OO是可行的, GObject就实现了,  
不过LZ所提供的, 可以说是一个笑话了, 都没有搞明白class和object是什么.


一直有人说OIOIC怎么怎么样的, 开始的时候,我以为那是一个玩具, 现在看来, 是一个非常糟糕的玩具,
作者连什么是内联, 编译器在什么情况下内联都没弄明白.  C语言是没有内联的, inline是C++的关键字,
只不过有一些编译器对C语言扩展了, 于是实现了这个东西.
以下是OIOIC里的o.h里的一段:

/*
*
* 名称:_INLINE_
* 描述:宏定义内联指示符,因为编译器的内联指示符不统一。
* 备注:一定要定义为有效的内联指示符,否则即使编译通过,内联也是无效的,编译
*       器会自动把用其修饰的函数转为非内联编译。
*/
#define     _INLINE_                      __inline
     
这哥们看来不知道, gcc只有开2级优化或以上, 才能内联, 不然不内联的,
内联与否, 编译器有决定权的.

o.c和o.h居然把同样的代码写了2次, 而且说o.h里是内联的, 哎,做程序员是一个危险的职业,有可能会中风的吧.



OIOIC的作者的中风己基本治不好了, 至于还在SB中的同学们, 醒醒吧, 如果想用C玩OO,  看看gobject吧.
作者: btdm123    时间: 2011-11-12 16:44
很多情况下,面向对象可以让简单问题更简单,使复杂问题更复杂。关键看这个问题的nature是不是面向对象的,比如图形界面可以说是,但操作系统明显就不是
作者: wait_rabbit    时间: 2011-11-12 18:37
C语言是没有内联的, inline是C++的关键字,
gtkmm 发表于 2011-11-12 04:17


c99 是有内联函数的。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2