2012-04-05 133 views
2

爲了方便,我正在編寫一個通用的Array類和重載操作符。我已經得到了我的數組對象以保存其他數組對象,但我無法覆蓋*運算符。我需要複製左側的對象,所以我的操作*代碼是這樣的:C++模板複製構造函數深拷貝

Array<T>& operator*(const double scalar) { 
    return Array<T>(*this) *= scalar; 
} 

(符* =已超載和作品)。

我推翻如下拷貝構造函數:

更新:新的拷貝構造函數:

Array<T> (const Array<T>& copyfrom) { 
    size_=copyfrom.size(); 
    data=new T[size_]; 
    copy(&copyfrom.data[0], &copyfrom.data[size_], data); 
} 

我的想法是,如果陣列是不是通用的,但總是充滿了一種原始的,該代碼會工作。但我認爲這裏發生了一些事情,因爲我使用的模板導致了我不期望的行爲。新「深度複製」數組中的數據數組就像它只是「copyfrom」數據數組的淺指針副本。

如何使用模板使此複製構造函數對基元和對象都起作用?或者,更好的是,有沒有辦法重載運算符*而不必擔心複製構造函數?謝謝。

編輯:這是operator*=的代碼。但我仍然認爲我的問題在於我使用複製構造函數。

Array<T>& operator*=(const double scalar) { 
    for (int i=0; i<size_; i++) 
     data[i]*=scalar; 
    return *this; 
} 

編輯:我意識到,我得到的問題,因爲我忽略了我的內心陣列的size在我的數組的數組。事情現在更可靠。每個人都很有幫助,而且我認爲我正在開展這項工作。我的operator=(我沒有超載;很好,邁克爾)現在如下所示。它的行爲如預期,但我開始在我的程序中出現malloc錯誤,我正在探索原因。這裏的內存管理有什麼問題嗎?

Array<T>& operator=(const Array<T>& a) { 
    if (this==&a) 
     return *this; 
    delete [] data; 

    size_=a.size(); 
    data=new T(size_); 
    copy(&a.data[0], &a.data[a.size()], data); 

    return *this; 
} 

編輯:我修正了malloc錯誤!我的方法現在都按預期工作。內存問題來了,因爲我有這種方法頭:

template <typename T> 
static Array<T> matrixSolve (Array<Array<T> > m); 

我正在按值的數組。各種各樣的問題。通過參考獲取數組,一切都解決了。感謝大家的幫助!

+0

@MichaelAnderson'operator *'的代碼不應該返回'this'。 'Array (* this)'的調用調用了我已經確認的拷貝構造函數。另外,如果我使用'operator *'const,那麼當我使用'operator * ='時,我不會收到編譯錯誤,所以我不能改變'this'。 – Enigmoid 2012-04-05 11:01:08

+0

你是對的 - 我會刪除這些評論。 – 2012-04-05 12:21:28

+0

你能告訴我們'Array :: operator ='?當你使用'data [i] = copyfrom.data [i]'時,你正在爲數據調用'operator ='。如果那沒有定義你會得到默認的。所以,如果你嵌套陣列和陣列沒有=然後壞事情會發生。 – 2012-04-05 12:25:35

回答

3

你會希望你的operator *成員函數看起來是這樣的:如果你返回一個Array<T> &,那麼你將被返回到臨時將被摧毀了一個參考

Array<T> operator*(const double scalar) const { 
    Array<T> result(*this); 
    result *= scalar; 
    return result; 
} 

,導致未定義行爲。

+0

你可能也想讓'operator *'const也是。 – 2012-04-05 03:02:23

+0

@MichaelAnderson:真的 - 改變了 – 2012-04-05 03:52:35

+0

把這三條線合在一起沒什麼不好,就像OP的原始代碼一樣;事實上,我認爲它更具可讀性,因爲您不會引入聲明臨時變量名稱的噪音,並且它立即可見,您實際上正在執行「'* this * = scalar' with backup」。它只是通過引用返回以及缺少錯誤的const。 – leftaroundabout 2012-04-05 11:14:26