我在c ++中重载运算符+ =和+时遇到问题。我有以下内容,我不知道为什么......:"二进制表达式的操作数无效(Matrice *和Matrice *)你有什么想法吗?谢谢。
注意:operator =确实有效。
#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
#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 ;
}
#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 */
答案 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的指针。 您需要使用新的声明来制作真实的副本。
您需要检查此项以避免意外错误。