[問題] 關於 template

看板C_and_CPP (C/C++)作者 (La new今年總冠軍)時間16年前 (2009/11/16 14:05), 編輯推噓4(4012)
留言16則, 4人參與, 最新討論串1/1
遇到的問題: (題意請描述清楚) 我分別寫了一維與二維矩陣的template, 可以依使用者產生不同大小與型別(int or double...) 最近想在二維矩陣中加入一個function, 其目的是從這二維矩陣中任意選擇其中一個column並回傳給一維矩陣。 希望得到的正確結果: 回傳出自訂的一維矩陣(template) 程式跑出來的錯誤結果: 編譯能過,但執行不能(會當掉)。 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) VC++ 6.0 有問題的code: (請善用置底文標色功能) 宣告: template<typename T> class CArray1D { public: T* m_Array; int m_ArraySize; CArray1D(){m_Array = NULL;}; CArray1D(int); creat(int); destroy(); virtual ~CArray1D(); T& operator[](int); }; template<typename T> class CArray2D { public: T** m_Array; T* m_Data; int m_ArrayXSize; int m_ArrayYSize; CArray2D(){m_Data = NULL;}; CArray2D(int, int); creat(int, int); destroy(); CArray1D<T> getColumn(int ColNum); virtual ~CArray2D(); T* operator[](int); }; ====================================================================== 定義: template<typename T> CArray1D<T> CArray2D<T>::getColumn(int ColNum){ CArray1D<T> tmp(m_ArrayXSize); for (int i = 0; i < m_ArrayXSize; i++) tmp[i] = m_Array[i][ColNum]; return tmp; } ====================================================================== 補充說明: 整理一下我目前的問題, 就是我不知道如何回傳一個同為自行定義的template-- CArray1D<T>的型態。 懇請各位先進能撥空給予指點,謝謝大家。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.37.71.9

11/16 14:19, , 1F
你沒定義正確的 copy-ctor 和 copy-assignment
11/16 14:19, 1F

11/16 14:20, , 2F
然後又回傳暫時物件,就會產生 double delete
11/16 14:20, 2F

11/16 14:20, , 3F
這問題和 template 沒什麼關係
11/16 14:20, 3F

11/16 14:20, , 4F
喔喔喔!這樣我知道了 對 難怪無法等於過去 驚醒 感謝您
11/16 14:20, 4F

11/16 14:23, , 5F
你在CArray1D的dtor裡面把T*的指標delete掉嗎
11/16 14:23, 5F

11/16 14:28, , 6F
給holy 是的 解構時我把它delete掉了
11/16 14:28, 6F

11/16 14:28, , 7F
請問這樣會造成什麼影響嗎@@ 謝謝
11/16 14:28, 7F

11/16 14:52, , 8F
在暫時物件解構時你的pointer就被delete掉了 傳回去的東
11/16 14:52, 8F

11/16 14:52, , 9F
西,其m_Array當然也是個null pointer
11/16 14:52, 9F

11/16 15:53, , 10F
樓上: 是 null ptr 還好... delete null 反而安全
11/16 15:53, 10F

11/16 15:54, , 11F
是 ptr 指向不合法的位置才對.
11/16 15:54, 11F

11/16 16:00, , 12F
我的pointer只有在不是指向NULL的時候會delete
11/16 16:00, 12F

11/16 16:08, , 13F
只是非 null 才 delete 或是不是null 都 delete 不是
11/16 16:08, 13F

11/16 16:08, , 14F
重點呀... =_=... 重點是 double delete
11/16 16:08, 14F

11/16 18:54, , 15F
欸對耶 我看錯了 copy是在解構前發生的 所以是會指向
11/16 18:54, 15F

11/16 18:55, , 16F
一個已經被delete掉的位址XD
11/16 18:55, 16F
文章代碼(AID): #1B0EknUS (C_and_CPP)
文章代碼(AID): #1B0EknUS (C_and_CPP)