0

我有一个关于 c++ 的考试。下面有说明:

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

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

主.cpp:

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

     m2= m2+m3;

     return 0;
     }

矩阵.h:

      class Matrix{

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

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

矩阵.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;
}
4

2 回答 2

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)字节丢失,您无法访问。

这可以在不使用指针的情况下轻松完成,您将学到很多东西。注意你的最后期限。希望能帮助到你。

于 2019-11-20T21:17:25.943 回答
-1

您编写的运算符可以称为

// 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);

但是,operator+预计将 aconst Matrix&作为参数并返回 a Matrix。只需从代码中删除所有指针,它就已经几乎是正确的。

于 2019-11-20T20:49:25.993 回答