2015-07-04 31 views
0

我在使用動態數組重載=運算符時遇到了問題。這是我迄今爲止所擁有的。此外,我知道我還沒有寫我的析構函數或構造函數,但我需要把重點放在該運營商第一次:C++爲動態多維數組錯誤重載賦值運算符

在我的頭文件:

#ifndef fasdf_dynn_h 
#define fasdf_dynn_h 

#include <iostream> 
#include <fstream> 
#include<string> 
#include <cstdlib> 
#include <vector> 

using namespace std; 
template <class T> 

class MatrixdynVector{ 

public: 
    template <class H> 
    MatrixdynVector<H>& operator =(const MatrixdynVector<H>& c) 
    { 
     if (this == &c)//checks for self assignment 
     { 
      return *this; 
     } 
     else 
     { 
      delete [] matrix; 
      matrix=new int[c.m*n]; 
      this->m=c.m; 
      this->n=c.n; 
      return *this; 

     } 
    } 
private: 
    int m,n; 
    int** matrix; 
}; 


#endif 
+0

你能詳細說明你有什麼樣的麻煩嗎? – user4578093

+0

@ user4578093字面上我不知道我在做什麼,我需要幫助重載動態數組的=運算符。我不知道如果我在正確的軌道im內存中的東西薄弱 – Brogrammer

+0

即使你有一個「templated operator =」,你仍然需要非模板版本,否則編譯器會爲你生成一個。 –

回答

0

我只看到現在的主要問題;

第一,你正在爲你的新數據數組分配c.m * this-> n內存,我假設你想分配c.m * c.n內存。

最後,我強烈建議您仔細看看複製構造函數,因爲在返回此類型的矩陣時,刪除函數可能會導致數據損壞。

具體來說,如果你在堆棧上分配這個類,不要創建一個明確的拷貝構造函數,也不要確保你總是返回一個拷貝,對象的數據將被刪除(我假設你要去在你的析構函數中刪除[]'matrix'),並且返回的對象將有'矩陣'指向被刪除的數據。當我創建自己的矩陣類時,我遇到了這個確切的問題。

如果你確實想要一個多維數組,你可以像這樣創建它;

matrix = new int*[c.m]; 
for (int i = 0; i < c.m; i++) 
    matrix[i] = new int[c.n]; // create a multi dimensional array 

for (int i = 0; i < c.m; i++) 
    for (int j = 0; j < c.n; j++) 
    matrix[i][j] = c.matrix[i][j]; // add data to it 

我差點忘了,對於析構函數,你需要用for循環刪除矩陣;

for (int i = 0; i < c.m; i++) 
    delete[] matrix[i]; // delete the second dimension of the matrix 

delete[] matrix; // delete the first 

繼承人拷貝構造函數

MatrixdynVector<H>::MatrixdynVector(const MatrixdynVector<H>& oMat) 
    : m(oMat.m), n(oMat.n), matrix(new int*[oMat.m]){ 
    for (int i = 0; i < m; i++){ 
    matrix[i] = new int[n]; 
    for (int j = 0; j < n; j++) 
     matrix[i][j] = oMat.matrix[i][j]; 
    } 
} 

這個拷貝構造函數中最重要的部分是該參數是常量&型--IF它沒有做這樣的一個例子,呼叫將成爲遞歸 - 並且正在進行重複。每當動態分配的內存屬於某個對象時,必須非常小心,以確保它具有一個每次調用時都會分配新內存的複製構造函數,否則默認構造函數將簡單地將該內存的所有權也交給該副本,從而導致它將被複制刪除。您還應該注意,只要可能,應該使用引用傳遞此類型的對象,因爲使用副本重新分配內存的代價很高。

+0

雖然有我使用矩陣作爲指針指針嗎? – Brogrammer

+0

有沒有辦法,或者你在問什麼?我的意思是,如果你真的想使用多維數組(不會建議它),你可以分配一個int指針數組的第一行this; int * [c.m],然後使用循環爲數組中的每個條目分配一個int數組,我將在我的答案中添加一個示例。 – user4578093

+0

你的兩個例子都是在賦值運算符中進行還是僅僅是第一個例子,並且你的刪除矩陣的例子進入析構函數?除了創建一個多維數組,我的拷貝構造函數也應該和我的賦值操作符相同,如果不是那麼我該如何創建一個? – Brogrammer