推 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
推 tomap41017:c++0x的move語義似乎可以用上? 11/04 12:01
推 hilorrk:shared pointer 11/04 15:24
→ tropical72:拿到不少 keyword, 謝謝樓上各位不吝指教 *^_^* 11/04 19:54