C ++错误:“ Matrix *”和“ Matrix *”类型的无效操作数为二进制“ operator +”

时间:2019-11-20 20:39:32

标签: c++ matrix operator-overloading

我参加了有关c ++的考试。以下是说明:

  • Matrix * m2 =新的Matrix(3,4,9); →带有9的3x4矩阵
  • 矩阵运算→m2 = m2 + m3

我正在尝试将m2和m3相加并放置m2。但是有一个错误:类型为'Matrix *'和'Matrix *'的无效操作数为二进制'operator +'。

main.cpp:

    int main(){
     Matrix *m2= new Matrix(3,4,9);
     Matrix *m3= new Matrix(3,4,2);

     m2= m2+m3;

     return 0;
     }

matrix.h:

      class Matrix{

      private:
      int x,y;
      vector<vector <int> > matris;

      public:
      Matrix(int row,int col,int z);
      Matrix* operator+(Matrix* no2);
      };

Matrix.cpp:

  Matrix::Matrix(int row,int col, int z){

        Matrix::x=row;
        Matrix::y=col;

        for(int i=0;i<x;i++){
            matris.push_back(vector <int>(y));
        }

        for(int i=0;i<Matrix::x;i++){
            for(int j=0;j<Matrix::y;j++){
                Matrix::matris[i][j]=z;
            }
          }
        }

Matrix* Matrix::operator +(Matrix* no2){

    Matrix* temp = new Matrix(this->x,this->y,0);

    for(int i=0;i<this->x;i++){
        for(int j=0;j<this->y;j++){
            temp->matris[i][j]=this->matris[i][j]+ no2->matris[i][j];
        }
    }
    return temp;
}

2 个答案:

答案 0 :(得分:0)

您写的运算符可以称为

contains()

但是,getIdinArray()应该采用makeEmployee()作为参数并返回// this is only for demonstration, not real code! Matrix *m_p1; Matrix *m_p2; Matrix m3; //... m_p2 = m3 + m_p1; // exactly the same as m_p2 = m3.operator+(m_p1); 。只需从代码中删除所有指针,即可使其几乎正确。

答案 1 :(得分:0)

让我们看看您对operator+的声明

Matrix* operator+(Matrix* no2);

实际上,operator+是成员函数,因此只能通过对象来调用。

因此,调用m2 + m3会转换为m2.operator+(m3),但是在您的代码m2中是一个指针,因此该语法无效。

您的运营商希望在LHS上使用对象,在RHS上使用指针。

m2 + m3中都是指针,没有为其定义合适的运算符。

解决方案

工作量少(难看)

m2 = (*m2)+m3;

在这里,您取消引用m2指向的对象

更多工作(不那么难看)

m2 = m2+m3;

但是在此之前,您必须为全局2个指针(外部类)定义+

Matrix* operator+(Matrix* m1, Matrix* m2) {
// do stuff
}

您将不得不与公众/朋友一起玩

我了解它是针对类的,但是除非您确实需要重新考虑每个仅对象方法,否则您不应使用指针。

m2 = m2 + m3中存在内存泄漏(不好的事情,吃了RAM),在这里您要为m2指定新的位置,而不删除旧的指向对象。因此,丢失了一个矩阵对象(> 60-90)字节,您无法访问。

这可以很容易地实现而无需使用指针,您将学到很多东西。注意您的截止日期。希望对您有所帮助。