[討論] 用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