2016-09-22 3 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

Не используйте указатели и «новые» без каких-либо оснований. – 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

Цель класса - сделать общедоступный интерфейс понятным. Если бы мне пришлось использовать класс Matrix, такой как 'C = & (* A + * B);' для добавления 'A + B', я бы сходил с ума. – PaulMcKenzie

Смежные вопросы