重载运算符+ =和+ Matrix c ++

时间:2016-09-22 20:44:21

标签: c++ matrix overloading

我在c ++中重载运算符+ =和+时遇到问题。我有以下内容,我不知道为什么......:"二进制表达式的操作数无效(Matrice *和Matrice *)你有什么想法吗?谢谢。

注意:operator =确实有效。

的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 */

2 个答案:

答案 0 :(得分:2)

在类中定义运算符时,它可以用于该类的实例,而不是指针。因此,如果您将代码更改为:

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

它应该有用。您还可以获得类似的效果,取消引用您的指针:

*C = *A + *B;

但没有理由在代码中使用动态分配的对象。例如,您的代码中存在内存泄漏,因为您没有正确的清理(删除语句)。

答案 1 :(得分:1)

您正在尝试添加指针。 A,B和C是指针。 要使用他们的运算符,您需要取消引用它们。

*C = *A + *B

会工作吗?  我还没有完全检查过任何副作用,但是这样可以让你的代码编译和运行。

但你的指针会搞砸了。 A和C将包含相同的值。 coefs得到B的值,然后返回指针A. 那么C就是指向B的指针。 您需要使用新的声明来制作真实的副本。

您需要检查此项以避免意外错误。