看板 C_and_CPP 關於我們 聯絡資訊
借個標題問,由於大型專案經驗較少,我想問的是設計模式或一些經驗。
littleshan:你要寫operator= 把預設的 memberwise copy 改掉11/03 22:36
littleshan:assign到c的時候是正確的,但這時候有兩個物件指到同一11/03 22:38
littleshan:塊記憶體 (一個是c另一個是暫時物件)11/03 22:39
littleshan:兩個物件解構時會造成 double delete11/03 22:39
以 matrix 而言,陣列那假設用 double **arr; 一般在設計時是較常用 shallow copy 或 deep copy ? 我是走 deep copy, 實際在用時較不容易發生 因為變數太多, 哪一個物件指到哪塊記憶體整個亂掉 (可能因人而異吧), 最重要的原因是,我解決不了 shallow copy 裡 double delete 問題 。 一想到維度一大就不適合用 deep copy,一方面記憶體不夠用, 一方面要複製會很花時間,最後想用鳥一點的方式取折衷 xMaxtrix& xMatrix:: scopy( const xMatrix& m) const; /* shallow */ xMatrix xMatrix:: dcopy( const xMatrix& m) const; /* deep */ xMatrix xMatrix:: operator = () const; /* 裡面做 shallow copy */ 不過完全不能以 shall copy 進行, (所以上面 code 也是白寫的 Orz) 因為做 shall copy , 最後物件解構時, 便如 littleshan 所言會有 double delete 情形發生, 不知是否有解決方案? ---- 另一問題是例外處理部份,我拿「高斯消去法」的例子做提問, class xMatrix ; vector<double> GaussJodarn(xMatrix lhs, vector<double> rhs); 在設計高斯消去法時,有幾個要點注意 1. 原本 n*m 矩陣,是否其中有幾個無效方程式,進而可等價成 n*n 方陣 (expect) 2. 消去法過程中 ,可能會出現 0 0 0 | 1 , 無解情形 (expect) 3. 消去法過程中 ,可能會出現 0 0 0 | 0 , 無限多解情形 (expect) 主要例外有這三組,問題如下, a. 有必要在 GaussJodarn 裡面做複製 xMatrix lhs 嗎 ? 還是就學 strtok 搞法,丟進去後就不能再用? b. 上面的 2.3 例外,在判斷是否可能有無解、無限多解情況下, 要確認的話,執行時間會拉很長,實際上在撰此副函式時, 是否會直接忽略例外發生之可能性,即 假設方程組必然唯一解? 而其它的例外確認動作,由 caller 端進行保證? ↑這樣感覺是有點怪怪的,因為就是不知道方程組的情形, 才用程式為之代勞,一直覺得這是個 trade off 問題, 好奇不知各位版友會如何設計? c. 如果 b 要處理的話 , 通常是做 log file 嗎 ? 其他的後續處理動作就叫別人看 log file ? 還是會再寫一份 expect class, (裡面 catch 也是 char*) 這樣別人去要 trace 的時候不就還要再去看那份 expect class 怎麼寫的? 以上,問題有點雜,煩請各版友不吝分享、解惑, 謝謝各位,小弟感激不盡。 -- No matter how gifted you are, alone, can not change the world. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.78.41 ※ 編輯: tropical72 來自: 180.177.78.41 (11/04 08:17)
shadow0326:用factory模式? 也就是用一個大的class統一生產管理 11/04 10:09
shadow0326:當ref count歸零才做delete 11/04 10:10
poyenc:http://bit.ly/vhzbDI 11/04 10:50
tomap41017:c++0x的move語義似乎可以用上? 11/04 12:01
hilorrk:shared pointer 11/04 15:24
tropical72:拿到不少 keyword, 謝謝樓上各位不吝指教 *^_^* 11/04 19:54