2016-09-22 123 views
-3

我在C++中重載運算符+ =和+時出現問題。我有以下幾點,我不知道爲什麼..「無效的操作數到二進制表達式(Matrice *和Matrice *)你有什麼想法爲什麼?謝謝。重載操作符+ =和+矩陣C++

NB:operator = does work。

的main.cpp

#include <iostream> 
#include <cmath> 
using namespace std ; 
#include "Matrice.hpp" 


int main() { 

double *tableau = new double[2*2]{1,4,3,2} ; 
double *tableau1 = new double[2*2]{1,6,4,-2} ; 
Matrice * A = new Matrice(2, tableau) ; 
Matrice * B = new Matrice(2, tableau1) ; 
Matrice * C = new Matrice() ; 

C = A+B ;} // error appears here 

Matrice.cpp

#include "Matrice.hpp" 

Matrice::Matrice(const Matrice& m) : dim(m.dim), coeffs(new   double[m.dim*m.dim]){ 
for(int i=0; i<dim*dim; i++) { 
    coeffs[i] = m.coeffs[i] ; 
} 

} 

Matrice::~Matrice() { 
delete [] coeffs ; 
} 

Matrice.hpp

#ifndef Matrice_hpp 
#define Matrice_hpp 

#include <iostream> 
using namespace std ; 

class Matrice { 
private : 
unsigned int dim; 
double * coeffs ; 

public : 
Matrice() { 
    dim = 2 ; 
    coeffs = new double[dim*dim] ; 
    for(int i=0; i<dim*dim; i++) { 
     coeffs[i] = 0 ; 
    } 
} 


Matrice(unsigned int n, double* v) : dim(n), coeffs(new double[dim*dim]) { 
    if(v) { for(int i=0; i<dim*dim; i++) { coeffs[i] = v[i] ;} 
    } 
    else { for(int i=0; i<dim*dim; i++) coeffs[i] = 0 ; } 
} 

Matrice(const Matrice&) ; 
~Matrice() ; 

int dimension() const {return dim;} 
void modifier(int position, int valeur) {coeffs[position] = valeur ; } 


Matrice& operator= (const Matrice& m) { 
    if(coeffs != m.coeffs) { 
     delete [] coeffs ; 
     dim = m.dim ; 
     coeffs = new double[m.dim*m.dim] ; 
     for(int i=0; i<m.dim*m.dim ; i++) { 
      coeffs[i] = m.coeffs[i] ; 
     } 
    } 

    return *this ; 
} 



Matrice& operator+=(const Matrice& m) { 
    for(int i=0; i<dim*dim; i++) { 
     coeffs[i] += m.coeffs[i] ; 
    } 

    return *this ; 
} 

Matrice&operator+ (const Matrice& m) 
{ 

    for(int i=0; i<dim*dim; i++) { 
     coeffs[i] = coeffs[i] + m.coeffs[i] ; 
    } 
    return *this ; 
} 



double* Coefficients() {return coeffs ;} 
void Afficher() { 
    for(int i=0; i<dim*dim; i++) { 
     if (i%dim == 0) {cout << endl ; } 
     cout << coeffs[i] << " " ; 
    } 
    cout << endl ; 
} 


}; 


#endif /* Matrice_hpp */ 
+5

不要無故使用指針和'new'。 – juanchopanza

+2

你的重載是'Matrice',而不是'Matrice *'。 – Barmar

+2

不要使用'new' _at all_ –

回答

2

當您在類中定義運算符時,它可以用於該類的實例,而不是指針。所以,如果你改變你的代碼:

Matrice A(2, tableau) ; 
Matrice B(2, tableau1) ; 
Matrice C = A + B; 

它應該工作。您也可以得到類似的效果提領您的指針:

*C = *A + *B; 

,但沒有理由在代碼中使用動態分配的對象。例如,由於沒有正確的清理(刪除語句),因此代碼中存在內存泄漏。

1

您正在嘗試添加指針。 A,B和C是指針。 要使用他們的操作符,您需要對其進行解引用。

*C = *A + *B 

會工作。 我還沒有完全檢查任何副作用,但這會讓你的代碼編譯和運行。

但你的指針會搞砸。 A和C將包含相同的值。係數是得到B的值,然後返回一個指針到A. C將是一個指向B的指針。 您將需要涉及一個新的語句來創建一個真正的副本。

您需要檢查以避免不必要的錯誤。

+3

一個類的目的是使公共接口可以理解。如果我不得不使用像這樣的矩陣類,那麼'C =&(* A + * B);'添加'A + B',我會堅持下去。 – PaulMcKenzie