作者tropical72 (藍影)
看板C_and_CPP
標題Re: [問題] 這樣的coding style好不好? (new delet …
時間Tue Jun 21 14:45:50 2011
※ 引述《genghiskii (SaoAn)》之銘言:
: //main.cpp
: int main()
: {
: int *in, *out, *mid1, ....*midn;
: new以上
: func(in, out, mid, ...midn);
: free掉
: }
恕刪.
這問題在 C++ 做規劃時應會較方便
( 就一個 class 有 data member, 再呼叫 initialize 去配置, release 做釋放)
C language 寫到後來幾乎都用下列方式, 應即推文中 LPH66 大所指。
以下實例,假設要做的是二個 matrix 相乘動作,A[x][y] * B[y][z]
例子可能沒舉得很好,但應可供參考。
首先,新建二個 file, Matrix.h / Martix.c ,內容大致如下
---------------
// Matrix.h
#ifndef __MATRIX__
#define __MATRIX__
void MatrixSetParam(int x, int y, int z); // 設大小
int MatrixAllocate(); // 做記憶體配置動作, return 0/1 : fail/success
void MatrixRead(); // 讀取 matrix 內容
int** MatrixMulti() ; // 執行乘法, 傳回結果之 pointer
void MatrixRelease() ; // 釋放記憶體大小
#end __MATRIX__
--------------
// Matrix.c
#include "Matrix.h"
static int **A, **B, **rst; // rst 是放結果用的
static int x, y, z;
static int* Alloc1(int X) {....} // 配置一維動態記憶體
static int** Alloc2(int X, int Y) {...}// 配置二維動態記憶體
static void Free2(int **p, int X, int Y) {...} // 釋放二維動態記憶體
到以上,這些資料變數、函式之 scope 都只存在於 Matrix.c 裡面,
意即「其他地方看不到」,除非引入 Matrix.c ,但這點很多人都知道, 別那麼幹!
會寫 Alloc1, Alloc2 是因這個動作在此 file 裡很常用到,
但這二個動作卻沒必要讓 main 裡東西去管理,於是寫在 matrix.c 裡面,
不讓 main.c 看到其 scope,
這作法我認為即相似於 class 中之 private member。
---------
接下來才繼續實做 Matrix.h 裡面有宣告的東西
void MatrixSetParam(int X, int Y, int Z)
{
x=X, y=Y, z=Z;
}
int MatrixAllocate()
{
A = Alloc2(x, y), B = Alloc2(y, z);
rst = Alloc2(x, z);
}
void MatrixRead() {...} // 讀取 matrix 內容
int** MatrixMulti() {....} // 執行,傳回結果
void MatrixRelease() {....} // 釋放記憶體大小
---------
其它的在 main 裡面就沒什麼就沒什麼特別的了
// main.c
int ** rst; // 準備接結果
MatrixSetParam(2,3,4);// 設參數
MatrixAllocate(); // 配記憶體
MatrixRead(); // 讀取 matrix 內容
rst = MatrixMulti(); // 執行乘法, 去接結果
MatrixRelease(); // 結束前釋放記憶體
---------
函式名稱我一律用 Matrix 開頭,是想效仿 class 之作用:
Matrix.SetParam(2, 3, 4); <=====> MatrixSetParam(2, 3, 4);
Matrix.Allocate(); <=====> MatrixAllocate();
至於 .h / .c 命名,實為一種藝術,目前我把它當 namespace 使用,
但這部份這麼比喻確實也沒那麼恰當。
---------
不停使用 alloc / release 時,我比較建議能包 class 就包 class
這樣在管理上比較方便,除非遇到跟我一樣的窘境:
限定,副檔名一律用 .c !! 即只能使用 C language 語法。
以上淺見,參之。
--
YouLoveMe() ? LetItBe() : LetMeFree();
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.73.222
→ angleevil:t哥,這是以前c用來封裝資料的方法嘛?只是c++ class有 06/21 15:15
→ angleevil:private member,所以不用那麼麻煩,可以這樣解釋嘛? 06/21 15:16
這方法我想在寫 hardware 的還是看得到, 畢竟 hardware「應」大多還是以 C 為主。
只是認為 c++ 如果要寫成上面這樣, 倒不如認真思考, 該程式碼是不是可以包成 class
以原原 po 而言,其程式碼「可能」是可以包成 class 的
(何況他 keyword 是用 new/delete, 非 malloc/free)
也可能是專案太小,認為還不到包 class 之地步。
※ 編輯: tropical72 來自: 180.177.73.222 (06/21 15:34)
推 tomap41017:推熱心分享!!辛苦了 06/21 15:58
推 angleevil:發卡<m.m> 06/21 16:01
→ loveme00835:static才是看不到喔! 不然我extern一樣用得到 06/21 16:11
→ tropical72:完全忘了這件事,多謝 loveme00835 補充指正這件事。 06/21 16:12
推 hilorrk:推樓上 我前幾天才犯過一模一樣的錯 忘記static才會找不到 06/21 19:02
推 ericwang1017:C有function pointer, 應該不用弄的那麼怪吧? 06/21 22:01
→ ericwang1017:struct包含fp,應該會更趨近於C++ 06/21 22:02
→ tropical72:eric~所指確實為是,只是用 C 模擬class實在是..到時引 06/21 22:44
→ tropical72:數要改麻煩很多,此篇只是針對原原po提一點經驗.離真正 06/21 22:45
→ tropical72:之 OO 實做的確是差很遠!! 06/21 22:45
推 ericwang1017:了解,謝分享 06/21 23:05
推 genghiskii:感謝分享! 06/21 23:27
※ 編輯: tropical72 來自: 180.177.78.41 (11/11 17:19)