【问题标题】:c++ error: invalid operands of types 'Matrix*' and 'Matrix*' to binary 'operator+'c ++错误:'Matrix *'和'Matrix *'类型的无效操作数到二进制'operator +'
【发布时间】:2019-11-20 20:39:32
【问题描述】:

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

  • 矩阵 *m2 = 新矩阵(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;
     }

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

【问题讨论】:

  • 你为什么在这里使用指针?
  • @Axalo 不,它没有。问题是指针不是全局 vs 成员
  • Matrix *m2= new Matrix(3,4,9); -- 不。摆脱所有的指针,大多数(如果不是全部)问题都会得到解决。没有任何理由在您的程序中使用单个 new,因为默认情况下 Matrix 可以毫无问题地复制。

标签: c++ matrix operator-overloading


【解决方案1】:

让我们看看你对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 新位置,而没有删除旧的指向对象。所以有一个 Matrix 对象 (>60-90) 字节丢失,您无法访问。

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

【讨论】:

  • 如果它需要访问私有数据,他可以在类中将其声明为friend Matrix* operator+(Matrix* m1, Matrix* m2) { /* do stuff */ }
  • 函数声明在class和friend作为前缀,而定义应该在外面,不需要在定义前加上friend。
【解决方案2】:

你写的操作符可以称为

// 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+ 应将const Matrix&amp; 作为参数并返回Matrix。只需从代码中删除所有指针即可使其几乎正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多