類別結構— (Define Class) | 高等C語言

文章推薦指數: 80 %
投票人數:10人

C 語言實作獨立的類別. 在前述的範例當中,我們直接將資料與函數封裝在結構當中,以形成物件,這種實作方式並沒有為類別定義獨立的結構,於是每個物件當中都會有一份 ... 高等C語言 Introduction 1. 簡介 2. 目錄 3. 語言基礎 3.1. 第一個程式--hello.js 3.2. hello.c 3.3. 加總--sum.js 3.4. sum.c 3.5. 函數--fsum.js 3.6. fsum.c 3.7. 函數--max.js 3.8. max.c 3.9. 陣列--array.js 3.10. array.c 3.11. 字串--string.js 3.12. string.c 3.13. 回呼--微分df.js 3.14. df.c 3.15. 回呼--積分integral.js 3.16. integral.c 3.17. 遞迴--recursive.js 3.18. recursive.c 3.19. 字典--dict.js 3.20. dict.c 3.21. 英翻中系統--mt.js 3.22. mt.c 3.23. 英中互翻系統--mt2.js 3.24. mt2.c 3.25. 中翻英系統--c2e.js 3.26. c2e.c 3.27. 自動產生英文語句 3.28. genen.c 3.29. JS的模組化 3.30. C的模組化 3.31. JS的物件導向 3.32. C的結構 4. 字串處理 4.1. 字串大小的問題 4.2. 字串的格式化 4.3. sprintf函數 4.4. sscanf函數 4.5. 標準字串函式庫 4.6. 字串的誤用 4.7. 動態字串物件 4.8. 寬字串函數 4.9. 寬窄字串間的轉換 4.10. 字串的誤用 5. 指標 5.1. 指標算術 5.2. 動態陣列物件 5.3. 陣列大小的問題 5.4. 函數指標 5.5. 函數指標型態 5.6. 變動參數 6. 結構 6.1. 結構的初始化 6.2. 結構中的位元欄 6.3. 結構的指標算術 6.4.鏈結串列 6.4.1. 鏈結串列-基礎版 6.4.2. 鏈結串列:內含物件版 6.4.3. 鏈結串列:外包物件版 7. 物件導向 7.1. 物件導向的基本概念--封裝,繼承,多型 7.2. 封裝—(Encapsulation) 7.3. 繼承—(Inheritance) 7.4. 多型—(Polymorphism) 7.5. 類別結構—(DefineClass) 8. 記憶體管理 8.1. C語言的執行環境 8.2. 記憶體漏洞 9. 檔案系統 9.1. 檔案緩衝區 9.2. 臨時暫存檔 9.3. 檔案錯誤 9.4. 目錄管理 10. 錯誤處理 10.1. 錯誤代號與訊息 10.2. 錯誤訊息列表 10.3. 檔案錯誤 10.4. 短程跳躍 10.5. 長程跳躍 10.6. 訊號機制 10.7. 模擬try...catch 11. 巨集處理 11.1. 將函數巨集化 11.2. 引用防護 11.3. 條件編譯 11.4. 編譯時期變數 11.5. 編譯時期函數 11.6. 編譯指示 11.7. 字串化 PoweredbyGitBook 高等C語言 C語言實作獨立的類別 在前述的範例當中,我們直接將資料與函數封裝在結構當中,以形成物件,這種實作方式並沒有為類別定義獨立的結構,於是每個物件當中都會有一份所有成員函數的指標,當物件的數量很多時,這可能會浪費不少記憶體。

前述的這種實作方式,比較像是一種變形後的物件導向實作法,這種方法稱為原型(Prototype)導向的實作法,像是JavaScript就採用了類似的實作方式。

如果我們要實作出像Java或C#一樣的物件導向作法,應該將類別的結構獨立出來,這樣會比較能夠規模化,而且通常可以節省記憶體。

在以下的程式中,我們將再度用C語言實作出這種方式,將物件與類別獨立成兩個不同結構。

如此,不管我們建立幾份物件,類別物件永遠都只會有一個,請看下列程式碼。

程式實作:將類別獨立出來 檔案:polyClass.c #include #defineShapeClassMembers(OBJ)float(*area)(structOBJ*) #defineShapeMembers(OBJ) struct_Shape; typedefstruct_ShapeClass{//Shape物件,沒有欄位 ShapeClassMembers(_Shape); }ShapeClass; typedefstruct_Shape{ ShapeClass*class; ShapeMembers(_Shape); }Shape; floatShapeArea(Shape*obj){return0;} ShapeClassshapeClass={.area=ShapeArea}; struct_Circle; typedefstruct_CircleClass{ ShapeClassMembers(_Circle); floatr; }CircleClass; typedefstruct_Circle{ CircleClass*class; ShapeMembers(_Circle); floatr; }Circle; floatCircleArea(Circle*obj){return3.14*obj->r*obj->r;} CircleClasscircleClass={.area=CircleArea}; intmain(){ Shapes={.class=&shapeClass}; Circlec={.class=&circleClass}; c.r=3.0; Shape*list[]={&s,(Shape*)&c}; inti; for(i=0;i<2;i++){ Shape*o=list[i]; printf("s.area()=%G\n",o->class->area(o)); } } 執行結果 D:\cp>gccpolyClass.c-opolyClass D:\cp>polyClass s.area()=0 s.area()=28.26



請為這篇文章評分?