[讨论]用纯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. 多态 -----> 自己可以维护一张虚函数表,管理函数指针
[解决办法]
支持这个帖子,看了一下,确实很不错,学习了。
[解决办法]
研究下 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的强项,
[解决办法]
[解决办法]
STRUCT就可以做到,但不能继承
C++主要为了看着爽啊
[解决办法]
如果你想搞明白这个,你最好研究一下postgre的源码,基本上用c来模拟OOP的
[解决办法]
既然想要实现面向对象,干嘛不用支持面向对象的语言?
就像去某个地方可以打飞的,你却要骑毛驴
[解决办法]
------解决方案--------------------
有人写过类似的书,挺不错的,网上可以下载的。
用C实现OO,可以更清楚的知道底层的机制。
[解决办法]
见过用C那么设计的,当时看的我头大了!
[解决办法]
哎,那方面不是很懂!我菜鸟一个!呵呵!
[解决办法]
有时候用面向对象的方法来解决问题更简单,但是编译器不支持面向对象语言,只支持C和汇编。。。所以探讨下这个问题还是很有必要的。 我们公司现在使用的方法就是用C语言实现部分面向对象的思想。
[解决办法]
有本专著:
Object-Oriented Programming With ANSI-C
这本书看起来很难懂的样子.
也有代码可以下载来玩耍.
[解决办法]
说到底,面向对象不是由面向过程在支撑起来的么。
[解决办法]
我认为关键是编译器怎么把面向对象的特点转化成面向结构
[解决办法]
[解决办法]
话说,,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");}
[解决办法]
学习~
[解决办法]
[解决办法]
learning
[解决办法]
[解决办法]
mark
[解决办法]
用struct,用函数指针作为结构体struct的成员.
[解决办法]
JF
[解决办法]
up
[解决办法]
[解决办法]
这个问题作为学习研究还可以。
要做C-OOP来做项目的话,直接C++就好了。
[解决办法]
OOP主要思想是继承,封装,多态.
C不是面向对象语言,不支持类操作
如果非要强制定义类的话,理论上只能通过结构体,函数的方法
但是这样定义的类很难实现OPP的三个主要特性
因此OPP的话还是用C++吧,毕竟C++是C的专门的面向对象的语言.
[解决办法]
看看TCPMP的源码不就知道了
[解决办法]
为什么呢? 为什么非要叫女人站着小便, 男人每月流血不可呢?
这又有多大的创意, 多高的境界呢?
[解决办法]
值得考虑啊,为什么一种语言就不能完美呢、
[解决办法]
ding
[解决办法]
可以做,看一些老的窗口界面的程序就明白了。
自己要写个核心,实现message循环。
规定用于继承的的函数定义方法。比如函数定义的时多+个爸爸参数,编译前用脚本抽出成函数指针列表。
感觉就是自己做了些C++编译器的事情。
以前经历过这种项目,然后转去做OO,认识会更深刻一些。
至于用 struct 模拟,只是学个型,个人以为没太大意义。
[解决办法]
一般是利用宏技巧
[解决办法]
[解决办法]
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年
你可以去网上找找当年的试题
[解决办法]
[解决办法]
不是有 object C吗?
[解决办法]
最早的C++编译器就是先编译成c代码,然后用c编译成目标文件
[解决办法]
在我的印象中,LINUX源码里确实有采用C来模拟面向对象的代码
[解决办法]
我听王爽老师讲的用c语言做顺序表,里边讲到怎样使顺序表通用(存储任何类型数据),可以实现类似OOP,主要用结构体实现,相对于C++来说比较复杂
[解决办法]
UP
[解决办法]
浏览学习...