C++ 运算符重载c++;建议

C++ 运算符重载c++;建议,c++,operators,operator-overloading,C++,Operators,Operator Overloading,我正在努力解决操作员过载的问题。在这种情况下,我有+运算符和我尝试过的示例,任何帮助都将不胜感激 我收到一个错误,上面写着“invaild使用'class Matrix',我不确定如何解决这个问题,如何将这两个矩阵对象添加到一起 Matrix Matrix::operator+(const Matrix& rhs){ return Matrix(Matrix + rhs.Matrix()); } Matrix::Matrix(int MM, int NN){

我正在努力解决操作员过载的问题。在这种情况下,我有+运算符和我尝试过的示例,任何帮助都将不胜感激

我收到一个错误,上面写着“invaild使用'class Matrix',我不确定如何解决这个问题,如何将这两个矩阵对象添加到一起

Matrix Matrix::operator+(const Matrix& rhs){
return Matrix(Matrix + rhs.Matrix());
}


   Matrix::Matrix(int MM, int NN){
                  M = MM;
                  N = NN;
                  data = new double[M * N];
                  for ( int i =0; i < M; i++)
                  {
                      for (int j = 0; j < N; j++)
                      {
                          data[i* N+j] = (double) 1000 + i*N+j;
                    //      cout << data[i*N+j] <<"\t";
                      }
                      //cout <<"\n";
                  }

       cout << "Matrix Constructor... (code to be implemented here!!!)\n";}
矩阵::运算符+(常量矩阵和rhs){
返回矩阵(矩阵+rhs.Matrix());
}
矩阵::矩阵(int-MM,int-NN){
M=MM;
N=NN;
数据=新的双精度[M*N];
for(int i=0;irhs是一个
矩阵
  • 像方法一样调用构造函数是非常非法的
  • Matrix+rhs
    中,
    Matrix
    不是标识符
  • 一旦你弄清楚了你的标识符,
    *this+rhs
    相当于
    this->operator+(rhs)
  • rhs是一个
    矩阵
  • 像方法一样调用构造函数是非常非法的
  • Matrix+rhs
    中,
    Matrix
    不是标识符
  • 一旦你弄清楚了你的标识符,
    *this+rhs
    相当于
    this->operator+(rhs)

  • jpm的答案非常重要。一旦你解决了这些问题,你可以看看我的答案

    从本质上讲,运算符重载与任何其他函数都没有区别

    因此,在以下情况下:

    Matrix Matrix::operator+(const Matrix& rhs)
    
    你真正要做的是:将rhs添加到当前矩阵,并返回一个新矩阵。你的重载不应改变当前矩阵。请自便并使用常量:

    Matrix Matrix::operator+(const Matrix& rhs) const
    
    这样的矩阵加法应该首先检查矩阵是否具有相同的维度,以便您可以将它们添加到一起,然后循环所有“单元格”并添加它们,然后从中创建矩阵。为此,我猜您需要第二个构造函数,类似于:

    Matrix::Matrix(int MM, int NN, double values[])
    {
        M = MM;//TODO: change to width
        N = NN;//TODO: change to height
        data = new double[M*N];
        for(int i < 0; i < M; i++)
            for(int j < 0; j < N; j++)
                data[i * N+j] = values[i * N+j];
    }
    
    矩阵(int-MM,int-NN,双值[]) { M=MM;//TODO:更改为宽度 N=NN;//TODO:更改为高度 数据=新的双精度[M*N]; for(int i<0;i
    jpm的答案非常重要。一旦你解决了这些问题,你可以看看我的答案

    从本质上讲,运算符重载与任何其他函数都没有区别

    因此,在以下情况下:

    Matrix Matrix::operator+(const Matrix& rhs)
    
    你真正要做的是:将rhs添加到当前矩阵,并返回一个新矩阵。你的重载不应改变当前矩阵。请自便并使用常量:

    Matrix Matrix::operator+(const Matrix& rhs) const
    
    这样的矩阵加法应该首先检查矩阵是否具有相同的维度,以便您可以将它们添加到一起,然后循环所有“单元格”并添加它们,然后从中创建矩阵。为此,我猜您需要第二个构造函数,类似于:

    Matrix::Matrix(int MM, int NN, double values[])
    {
        M = MM;//TODO: change to width
        N = NN;//TODO: change to height
        data = new double[M*N];
        for(int i < 0; i < M; i++)
            for(int j < 0; j < N; j++)
                data[i * N+j] = values[i * N+j];
    }
    
    矩阵(int-MM,int-NN,双值[]) { M=MM;//TODO:更改为宽度 N=NN;//TODO:更改为高度 数据=新的双精度[M*N]; for(int i<0;i 您正在使用一个类型名(
    Matrix
    ),其中应该有一个表达式,这正是编译器所抱怨的。您还试图调用现有对象上的构造函数,这是无效的(而且是无意义的)。您似乎还试图实现
    运算符+
    ,使其能够调用自身;如果您确实以某种方式使其编译,那么它将由于无限递归而导致堆栈溢出

    也许实现加法的最简单方法是实现
    运算符+=
    将一个矩阵添加到现有矩阵,然后实现
    运算符+

    Matrix & Matrix::operator+=(Matrix const & rhs) {
        // Perform addition here
        for (int i = 0; i < N*M; ++i) {
            data[i] += rhs.data[i];
        }
        return *this;
    }
    
    // This can be a non-member function
    // Pass "lhs" by value to get a copy, then modify and return that.
    Matrix operator+(Matrix lhs, Matrix const & lhs) {
        return lhs += rhs;
    }
    
    // Or if you really want a member function for some reason
    Matrix Matrix::operator+(Matix const & rhs) const {
        return Matrix(*this) += rhs;
    }
    
    矩阵和矩阵::运算符+=(矩阵常数和rhs){
    //在此执行加法
    对于(int i=0;i
    这确实要求您拥有一个正确的复制构造函数-因为您自己在构造函数中分配内存,并且可能在析构函数中取消分配内存,所以必须实现一个复制构造函数来正确分配新内存(根据),否则在复制矩阵后将得到双重删除

    您正在使用一个类型名(
    Matrix
    ),其中应该有一个表达式,这正是编译器所抱怨的。您还试图调用现有对象上的构造函数,这是无效的(而且是无意义的)。您似乎还试图实现
    运算符+
    ,使其能够调用自身;如果您确实以某种方式使其编译,那么它将由于无限递归而导致堆栈溢出

    也许实现加法的最简单方法是实现
    运算符+=
    将一个矩阵添加到现有矩阵,然后实现
    运算符+

    Matrix & Matrix::operator+=(Matrix const & rhs) {
        // Perform addition here
        for (int i = 0; i < N*M; ++i) {
            data[i] += rhs.data[i];
        }
        return *this;
    }
    
    // This can be a non-member function
    // Pass "lhs" by value to get a copy, then modify and return that.
    Matrix operator+(Matrix lhs, Matrix const & lhs) {
        return lhs += rhs;
    }
    
    // Or if you really want a member function for some reason
    Matrix Matrix::operator+(Matix const & rhs) const {
        return Matrix(*this) += rhs;
    }
    
    矩阵和矩阵::运算符+=(矩阵常数和rhs){
    //在此执行加法
    对于(int i=0;i