首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

[讨论]用纯C怎么实现面像对象(oop), 见者有分

2012-04-17 
[讨论]用纯C如何实现面像对象(oop), 见者有分!希望高手们谈谈想法.共同学习,共同进步.[解决办法]这是我曾

[讨论]用纯C如何实现面像对象(oop), 见者有分!
希望高手们谈谈想法.共同学习,共同进步.


[解决办法]
这是我曾经发的帖子,里面的很多回复很有参考价值:http://topic.csdn.net/u/20090418/17/40711856-e144-4281-b1fc-7d44d545e59f.html
[解决办法]
去看LINUX源码
[解决办法]
纯C本来是不支持面向对象的理念的!!
如果想让它面向对象;就要用struct,

里面可以放一些数据成员和函数指针
调用起来有点面向对象的意思
[解决办法]
比较容易想到的就是结构体,里面有函数指针
这些函数的第一个参数是结构体的指针
这样来模拟this指针。

还有比较深入的可以再想想,比如多态
[解决办法]
用struct,用函数指针作为结构体struct的成员.
[解决办法]
呵呵。。。没想过这个方面的。。。
[解决办法]
纯C本来是不支持面向对象的理念的!! 
如果想让它面向对象;就要用struct, 
里面可以放一些数据成员和函数指针 
调用起来有点面向对象的意思

可是他,不支持虚函数之类的,还有运算符重载
[解决办法]
纯C本来是不支持面向对象的理念的!! 
如果想让它面向对象;就要用struct,
里面可以放一些数据成员和函数指针 
调用起来有点面向对象的意思

可是他不支持 多态,就是虚函数。还有运算符重载!
[解决办法]
学习...
[解决办法]
面向对象三大特征:
1. 封装 -----> struct,加上函数指针可以作为成员函数用
2. 继承 -----> 主要是高重用性,在C中可以采用struct组合的方式提高重用
3. 多态 -----> 自己可以维护一张虚函数表,管理函数指针
[解决办法]
支持这个帖子,看了一下,确实很不错,学习了。

探讨
这是我曾经发的帖子,里面的很多回复很有参考价值:http://topic.csdn.net/u/20090418/17/40711856-e144-4281-b1fc-7d44d545e59f.html

[解决办法]
研究下 BREW 平台~~~~
[解决办法]
顶一下,只能用struct了,但还是不能完全实现吧!
[解决办法]
其实很多成功的C软件就含有面向对象的思想。
本质上C是结构化,过程化语言。
真要像楼主说的那样,不如直接去用C++。硬做的话,得不偿失。
C标准委员会就曾拒绝了一个在C里加上简化版类的提案。
C就是C,不是C++。
[解决办法]
http://topic.csdn.net/u/20090418/17/40711856-e144-4281-b1fc-7d44d545e59f.html

记得有这么一篇,当时还回了蛮多,发现就是老邓的帖子。,
[解决办法]
呵呵,OOP不是C的强项,
[解决办法]
探讨
面向对象三大特征:
1. 封装 -----> struct,加上函数指针可以作为成员函数用
2. 继承 -----> 主要是高重用性,在C中可以采用struct组合的方式提高重用
3. 多态 -----> 自己可以维护一张虚函数表,管理函数指针

[解决办法]
STRUCT就可以做到,但不能继承
C++主要为了看着爽啊
[解决办法]
如果你想搞明白这个,你最好研究一下postgre的源码,基本上用c来模拟OOP的
[解决办法]
既然想要实现面向对象,干嘛不用支持面向对象的语言?

就像去某个地方可以打飞的,你却要骑毛驴
[解决办法]
探讨
既然想要实现面向对象,干嘛不用支持面向对象的语言?

就像去某个地方可以打飞的,你却要骑毛驴

------解决方案--------------------


有人写过类似的书,挺不错的,网上可以下载的。
用C实现OO,可以更清楚的知道底层的机制。
[解决办法]
见过用C那么设计的,当时看的我头大了!
[解决办法]
哎,那方面不是很懂!我菜鸟一个!呵呵!
[解决办法]
有时候用面向对象的方法来解决问题更简单,但是编译器不支持面向对象语言,只支持C和汇编。。。所以探讨下这个问题还是很有必要的。 我们公司现在使用的方法就是用C语言实现部分面向对象的思想。
[解决办法]
有本专著:

Object-Oriented Programming With ANSI-C

这本书看起来很难懂的样子.

也有代码可以下载来玩耍.


[解决办法]
说到底,面向对象不是由面向过程在支撑起来的么。
[解决办法]
我认为关键是编译器怎么把面向对象的特点转化成面向结构
[解决办法]

探讨
用0和1,面向对象,数据结构,设计模式,三个代表,用打孔纸带机,才是IT纯爷们,铁血真汉子

[解决办法]
话说,,C的结构里可以套函数
[解决办法]
支持bitxinhai的看法"纯C本来是不支持面向对象的理念的!! 
如果想让它面向对象;就要用struct, 
里面可以放一些数据成员和函数指针 
调用起来有点面向对象的意思"
《C++编程思想》里面有解释的!

BTW:(to bitxinhai):你是bit的?
[解决办法]
没考虑过这方面,向大家学习。。。。
[解决办法]
说C不能实现虚函数的建议去看看C++的虚函数是怎么实现的,不过是函数指针罢了
[解决办法]
C/C++ code
#include <stdio.h>#include <stdlib.h>#define GET_VTBL(p,type) ((type*)(void*)p)->pvttypedef struct Base Base;typedef struct BaseVtable{    void (*test1)(Base*);    void (*test2)(Base*);//创建虚表}BaseVtable;typedef struct Base{    BaseVtable* pvt;    }Base;#define INHERIT_Base(name) \        void (*test1)(name*); \        void (*test2)(name*)    void Basetest1(Base *p) {    printf("------------------------------------\n");    printf("This is Base'test1() function\n");    printf("------------------------------------\n");}void Basetest2(Base *p) {    printf("------------------------------------\n");    printf("This is Base'test2() function\n");    printf("------------------------------------\n");}#define CreatObject(p,type) \                          //为对象分配空间,初始化虚表    p = (Base*)malloc(sizeof(type));\    p->pvt=(BaseVtable*)malloc(sizeof(BaseVtable));\    p->pvt->test1 = type##test1;\    p->pvt->test2 = type##test2typedef struct DeriveVtable{        INHERIT_Base(Base);                              //简单模拟面向对象的 继承特性}DeriveVtable;typedef struct Derive{    DeriveVtable* pvt;     int a;    int b;}Derive;void Derivetest1(Base *p) {    printf("------------------------------------\n");    ((Derive*)p)->a=1;    ((Derive*)p)->b=2;    printf("This is Derive'test1() function\n");    printf("------------------------------------\n");}void Derivetest2(Base *p) {    printf("------------------------------------\n");    printf("a=%d,b=%d\n",((Derive*)p)->a,((Derive*)p)->b);    printf("This is Derive'test2() function\n");    printf("------------------------------------\n");}#define Invoke_Test1(p) GET_VTBL(p,Base)->test1((Base*)p);#define Invoke_Test2(p) GET_VTBL(p,Base)->test2((Base*)p);int main(){     Base *p = 0;    CreatObject(p,Base);         Invoke_Test1(p);    Invoke_Test2(p);    free(p);    CreatObject(p,Derive);     Invoke_Test1(p);                         //基类指针指向子类,函数调用的子类的,模拟多态~~~    Invoke_Test2(p);    system("pause");} 


[解决办法]
学习~
[解决办法]

探讨
C/C++ code
#include <stdio.h>
#include <stdlib.h>
#define GET_VTBL(p,type) ((type*)(void*)p)->pvt

typedef struct Base Base;

typedef struct BaseVtable
{
void (*test1)(Base*);
void (*test2)(Base*);//创建虚表
}BaseVtable;

typedef struct Base
{
BaseVtable* pvt;
}Base;
#define INHERIT_Base(name) \
void (*test1)(name*); \
void (*test2)(name*)


[解决办法]
learning
[解决办法]
探讨
有本专著:

Object-Oriented Programming With ANSI-C

这本书看起来很难懂的样子.

也有代码可以下载来玩耍.



[解决办法]
mark
[解决办法]
用struct,用函数指针作为结构体struct的成员.
[解决办法]
JF
[解决办法]
up
[解决办法]
探讨
面向对象三大特征:
1. 封装 -----> struct,加上函数指针可以作为成员函数用
2. 继承 -----> 主要是高重用性,在C中可以采用struct组合的方式提高重用
3. 多态 -----> 自己可以维护一张虚函数表,管理函数指针

[解决办法]
这个问题作为学习研究还可以。
要做C-OOP来做项目的话,直接C++就好了。
[解决办法]
OOP主要思想是继承,封装,多态.
C不是面向对象语言,不支持类操作
如果非要强制定义类的话,理论上只能通过结构体,函数的方法
但是这样定义的类很难实现OPP的三个主要特性
因此OPP的话还是用C++吧,毕竟C++是C的专门的面向对象的语言.
[解决办法]
看看TCPMP的源码不就知道了
[解决办法]
为什么呢? 为什么非要叫女人站着小便, 男人每月流血不可呢?
这又有多大的创意, 多高的境界呢?
[解决办法]
值得考虑啊,为什么一种语言就不能完美呢、
[解决办法]
ding
[解决办法]
可以做,看一些老的窗口界面的程序就明白了。
自己要写个核心,实现message循环。
规定用于继承的的函数定义方法。比如函数定义的时多+个爸爸参数,编译前用脚本抽出成函数指针列表。
感觉就是自己做了些C++编译器的事情。

以前经历过这种项目,然后转去做OO,认识会更深刻一些。

至于用 struct 模拟,只是学个型,个人以为没太大意义。
[解决办法]
一般是利用宏技巧

[解决办法]
探讨
这个问题作为学习研究还可以。
要做C-OOP来做项目的话,直接C++就好了。

[解决办法]
COM是面向对象的,用C是可以实现COM的,所以用C也能实现OOP,oop是一种思想而已
下面是用C实现IUnknown 接口
C/C++ code
typedef struct IUnknownVtbl    {        BEGIN_INTERFACE                HRESULT ( STDMETHODCALLTYPE *QueryInterface )(             IUnknown * This,            /* [in] */ REFIID riid,            /* [iid_is][out] */ void **ppvObject);                ULONG ( STDMETHODCALLTYPE *AddRef )(             IUnknown * This);                ULONG ( STDMETHODCALLTYPE *Release )(             IUnknown * This);                END_INTERFACE    } IUnknownVtbl;    interface IUnknown    {        CONST_VTBL struct IUnknownVtbl *lpVtbl;    }; 


[解决办法]
用结构体吧
[解决办法]
第一个oo的编译器是什么写的 ?
[解决办法]
struct
[解决办法]
菜鸟来学习一下
[解决办法]
应该用struct+point
[解决办法]
分享了!
[解决办法]
学习了
[解决办法]
mark
学习了

我读过用C实现面向对象

但是本人英文一般
再加上专业知识不足
没怎么理解

我感觉语言只是工具
面向对象是一种设计模式
用C去实现面向对象可能会比较复杂

[解决办法]
学习了~
[解决办法]
学习。为什么还要这么费事呢?
[解决办法]
我以前考《程序员》的时候 有个程序填空题 那程序代码所写的就是一个用C实现C++
我已经忘了我哪一年考的《程序员》 好像是05年
你可以去网上找找当年的试题
[解决办法]

探讨
struct + 宏 + 函数指针--->封装 继承 多态。

[解决办法]
不是有 object C吗?
[解决办法]
最早的C++编译器就是先编译成c代码,然后用c编译成目标文件

[解决办法]
在我的印象中,LINUX源码里确实有采用C来模拟面向对象的代码
[解决办法]
我听王爽老师讲的用c语言做顺序表,里边讲到怎样使顺序表通用(存储任何类型数据),可以实现类似OOP,主要用结构体实现,相对于C++来说比较复杂
[解决办法]
UP
[解决办法]
浏览学习...

热点排行