[討論] 用C來看物件導向(非學術)

看板C_and_CPP作者 (Monitor)時間9年前 (2014/12/13 17:48), 9年前編輯推噓5(5022)
留言27則, 10人參與, 最新討論串1/1
手機版程式縮排不見了 網頁版才有縮排 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 等等的基本功能小弟還想不出來... 不知道各位大大有沒有什麼想法? -- Sent from my Android -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.37.142.227 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1418464088.A.D85.html ※ 編輯: OPIV (114.37.142.227), 12/13/2014 18:02:31

12/13 18:02, , 1F
其實用 C 寫物件導向算頗常見的,舉例像 lighttpd 就是
12/13 18:02, 1F

12/13 18:03, , 2F
通常會在 struct 裡擺很多個 function pointer
12/13 18:03, 2F

12/13 18:04, , 3F
而這些 function pointer 都會有共同的第一個參數
12/13 18:04, 3F

12/13 18:04, , 4F
封裝 繼承 多態, 可以做出近似的東西但坦白說浪費資源
12/13 18:04, 4F

12/13 18:05, , 5F
選擇好用的部分就好
12/13 18:05, 5F

12/13 18:05, , 6F
那個就是當作 this 指標,型別就是那個 struct 自己
12/13 18:05, 6F

12/13 18:07, , 7F
找找 Object Oriented Programming in C 以了解更多
12/13 18:07, 7F

12/13 18:09, , 8F
C 做 OOP 最麻煩的是 virtual function table 啊 orz
12/13 18:09, 8F

12/13 18:09, , 9F
感謝L大解說!
12/13 18:09, 9F

12/13 18:09, , 10F
除非必要,寫 C++ 會比較開心一點,還有 boost 可以用
12/13 18:09, 10F

12/13 18:10, , 11F
C真的是個很棒的語言啊!
12/13 18:10, 11F

12/13 18:11, , 12F
還得自己弄 vtbl 的確也是一個困擾,還是寫 C++ 吧
12/13 18:11, 12F

12/13 18:12, , 13F
當然,如果是興趣也沒什麼不好,了解原理也是挺好的
12/13 18:12, 13F

12/13 18:12, , 14F
只是工作上,除非因為特殊目的禁止用 C++,方便點就好
12/13 18:12, 14F

12/13 18:33, , 15F
這是靜態
12/13 18:33, 15F

12/13 22:07, , 16F
gtk...
12/13 22:07, 16F

12/14 00:03, , 17F
ptt 的下棋功能有用到 vtable, gtk 更狠, 連繼承都有
12/14 00:03, 17F

12/14 19:19, , 18F
除非那個環境的abi/codegen沒有一個編譯器支援
12/14 19:19, 18F

12/14 19:20, , 19F
不然這樣徒手把c++的事情弄到c上真的只是在操語言能力
12/14 19:20, 19F
※ 編輯: OPIV (114.37.133.58), 12/14/2014 20:51:00

12/14 23:04, , 20F
其實應該說 glib 裡的 gobject
12/14 23:04, 20F

12/15 06:32, , 21F
敝人有寫過一篇簡易教學,可以參考看看
12/15 06:32, 21F

12/15 06:33, , 22F
基本上就是在struct內插入vtable http://goo.gl/KKWQ2u
12/15 06:33, 22F

12/15 06:35, , 23F
啊,更正,我的作法是把base class插入到derived class
12/15 06:35, 23F

12/15 06:36, , 24F
而不是插入vtable,這個作法只能單繼承就是了
12/15 06:36, 24F

12/15 06:37, , 25F
這個做法確定可行,因為最後用這個方法做出個遊戲成品
12/15 06:37, 25F

12/15 06:38, , 26F
12/15 06:38, 26F

12/15 12:26, , 27F
c大超強!!!
12/15 12:26, 27F
文章代碼(AID): #1KZ0jOs5 (C_and_CPP)