[讨论] 用C来看物件导向(非学术)

楼主: OPIV (Monitor)   2014-12-13 17:48:06
手机版程式缩排不见了 网页版才有缩排
C 不是物件导向语言,但是我却在C里看见了物件导向的影子
如果你有用C写大而复杂的程式的经验,你会发现,有好几行的程式码都为了完成同一件
事情而存在
例如,程式里有"计算机功能",它需要读取stdin之后进行运算、判断,然后输出stdout
这样一个工作可能要由好多好多行程式码来共同完成,这让程式码的阅读变得困难了一些
,因为这组程式码共同完成一个工作,单一行的意义对人类而言不大
于是我们会兴起一个念头,要是一行程式码可以完成一件工作,那该有多好!
C语言提供的解决方法就是函式
物件导向则提供了管理这些函式的方法,它把函式归类
至于为什么C可以看到物件导向的影子呢?
前几天在上计概课的时候,就有想到,C 的 struct 好像有点像物件导向
例如电子鸡游戏
/*
* 定义"鸡"
*/
typedef struct Chicken {
char *name;
int eggsize;
int (* hungry)(int);
} Chicken;
/*
* 产生已初始化的新物件
*/
Chicken newChicken() {
int hungry(int time) {
if(time >= 999999)
printf("I am hungry!!!\n");
wait(60);
return 0;
};
Chicken c = {
.name = "default name",
.eggsize = 3,
.hungry = &hungry
};
return c;
}
/*
* 主程式
*/
int main(int argc, char *argv[]) {
Clock ck = newClock();
Chicken john = newChicken();
john.name = argv[1];
john.eggsize = 99;
while(!john.hungry(ck.getTime()));
return 0;
}
如果在标头加上
#define new
#define Chicken() newChicken()
就可以 Chicken c = new Chicken(); 了
但是 this super 等等的基本功能小弟还想不出来...
不知道各位大大有没有什么想法?
作者: LiloHuang (十年一刻)   2014-12-13 18:02:00
其实用 C 写物件导向算颇常见的,举例像 lighttpd 就是通常会在 struct 里摆很多个 function pointer而这些 function pointer 都会有共同的第一个参数
作者: PoorLoser (废文制造机)   2014-12-13 18:04:00
封装 继承 多态, 可以做出近似的东西但坦白说浪费资源选择好用的部分就好
作者: LiloHuang (十年一刻)   2014-12-13 18:05:00
那个就是当作 this 指标,型别就是那个 struct 自己找找 Object Oriented Programming in C 以了解更多
作者: uranusjr (←這人是超級笨蛋)   2014-12-13 18:09:00
C 做 OOP 最麻烦的是 virtual function table 啊 orz
楼主: OPIV (Monitor)   2014-12-13 18:09:00
感谢L大解说!
作者: LiloHuang (十年一刻)   2014-12-13 18:09:00
除非必要,写 C++ 会比较开心一点,还有 boost 可以用
楼主: OPIV (Monitor)   2014-12-13 18:10:00
C真的是个很棒的语言啊!
作者: LiloHuang (十年一刻)   2014-12-13 18:11:00
还得自己弄 vtbl 的确也是一个困扰,还是写 C++ 吧当然,如果是兴趣也没什么不好,了解原理也是挺好的只是工作上,除非因为特殊目的禁止用 C++,方便点就好
作者: CumCumCum (2 hard 2 hard)   2014-12-13 18:33:00
这是静态
作者: s25g5d4 (function(){})()   2014-12-13 22:07:00
gtk...
作者: scwg ( )   2014-12-14 00:03:00
ptt 的下棋功能有用到 vtable, gtk 更狠, 连继承都有
作者: sunneo (艾斯寇德)   2014-12-14 19:19:00
除非那个环境的abi/codegen没有一个编译器支援不然这样徒手把c++的事情弄到c上真的只是在操语言能力
作者: Bencrie   2014-12-14 23:04:00
其实应该说 glib 里的 gobject
作者: cjcat2266 (CJ Cat)   2014-12-15 06:32:00
敝人有写过一篇简易教学,可以参考看看基本上就是在struct内插入vtable http://goo.gl/KKWQ2u啊,更正,我的作法是把base class插入到derived class而不是插入vtable,这个作法只能单继承就是了这个做法确定可行,因为最后用这个方法做出个游戏成品http://allenchou.net/photon-bunny/ ←置入性行销 :P
楼主: OPIV (Monitor)   2014-12-15 12:26:00
c大超强!!!

Links booklink

Contact Us: admin [ a t ] ucptt.com