2014-01-19 67 views
0

我想寫一個cpp程序來做與運算符重載的矩陣運算。使用賦值運算符導致編譯器錯誤

我的類矩陣具有以下變量:

int m,n // order of the matrix 
int **M; 

起初,我有一個構造函數和析構函數使用new和delete操作符來分配和**中號釋放內存。我也有過載+, - 和*運算符的函數。但是當我運行程序時,我得到了垃圾值作爲結果。此外,在運行時,我得到一個錯誤(檢測到glibc)。

在這裏的類似問題告訴我,我應該添加一個「深拷貝」二維數組的複製構造函數。我也是這樣做的。但同樣的問題依然存在。

所以我給overload =運算符添加了一個函數。現在,無論何時使用'='運算符,我都會收到編譯時錯誤(對於調用'Matrix :: Matrix(Matrix)'的匹配函數。

這裏是我的功能:

拷貝構造函數

Matrix(Matrix& other) { 
    m=other.m; 
    n=other.n; 

    M= new int *[m]; 
    for(int i=0;i<m;i++) 
    M[i] = new int[n]; 

    //deep copying matrix 
    for(int i=0;i<m;i++) 
    for(int j=0;j<n;j++) 
     M[i][j]=other.M[i][j]; 
} 

超載*:

Matrix Matrix::operator*(Matrix A) { 
    Matrix pro(m,A.n); 
    for(int i=0;i<m;i++) 
    for(int j=0;j<A.n;j++) { 
     pro.M[i][j]=0; 
     for(int k=0;k<n;k++) 
     pro.M[i][j]+=(M[i][k]*A.M[k][j]); 
    } 
    return pro; 
} 

超載=::

Matrix Matrix::operator=(Matrix a) { 
    m=a.m; 
    n=a.n; 
/* 
    M=new int* [m]; 
    for(int i=0;i<m;i++) //I also tried allocating memory in this function 
    M[i]=new int[n]; 
*/ 
    for(int i=0;i<m;i++) 
    for(int j=0;j<n;j++) 
     M[i][j]=a.M[i][j]; 
    return *this; 
} 
在main()
Matrix M1(m,n); 
Matrix M2(p,q); 

//inputting both matrices 

Matrix M3(m,n); 
Matrix M4(m,q); 

M3 = M1 + M2; // Compile Time Error here... 
M3.show(); 

M3 = M1 - M2; //...here... 
M3.show(); 

M4 = M1*M2; //...and here. 
M4.show(); 

編譯時錯誤:調用的Matrix矩陣::(矩陣)「

+0

'矩陣(矩陣&)'我強烈懷疑你想要那樣。也許用'const'? –

+0

您還應該使用'const&'作爲其他函數中的參數,以避免不斷複製矩陣。 –

+0

'Matrix Matrix :: operator =(Matrix a)... return * this;'沒有錯?它需要一個Matrix(Matrix)構造函數 – user3125280

回答

1
Matrix& Matrix::operator=(const Matrix& a) { 
    m=a.m; 
    n=a.n; 
/* 
    M=new int* [m]; 
    for(int i=0;i<m;i++) //I also tried allocating memory in this function 
    M[i]=new int[n]; 
*/ 
    for(int i=0;i<m;i++) 
    for(int j=0;j<n;j++) 
     M[i][j]=a.M[i][j]; 
    return *this; 
} 

賦值運算符的簽名錯誤沒有匹配的功能,使return *this試圖調用構造函數類型矩陣(矩陣),它不存在。確保返回上面的參考。

從其他答案談到有效執行拷貝構造函數和賦值操作符的
+0

除非使用複製和交換習語,否則參數應該作爲'const&'傳遞。 – Manu343726

+0

@ Manu343726對不起復制和粘貼作業,修正 – user3125280

0

除了(你的代碼是不是很有效,但它應該工作),似乎只是一個小錯誤:

Matrix(Matrix& other) { ... }似乎超出了命名空間。更改爲:

Matrix::Matrix(const Matrix& other) { ... }

+0

可能它在類定義中,但OP不是很響應 – user3125280