0

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

我收到一个错误,上面写着“'class Matrix'的使用无效我不确定如何解决这个问题如何将这两个 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";}

谢谢

4

3 回答 3

4
  1. rhs一个Matrix
  2. 像方法一样调用构造函数是非常非法的
  3. in Matrix + rhs,Matrix不是标识符
  4. 一旦你理顺了你的标识符,*this + rhs就相当于this->operator+(rhs). 很明显,您在这里所做的只是创建了一个无限递归。
于 2012-04-06T10:55:56.553 回答
1

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];
}
于 2012-04-06T11:07:17.087 回答
0
return Matrix(Matrix + rhs.Matrix());
              ^^^^^^       ^^^^^^

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

实现加法的最简单方法可能是实现operator+=将一个矩阵添加到现有矩阵,然后按照以下方式实现operator+

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;
}

这确实需要您有一个正确的复制构造函数 - 因为您自己在构造函数中分配内存,并且可能在析构函数中释放它,所以您必须实现一个复制构造函数来正确分配新内存(根据三规则),否则复制矩阵后会出现双重删除。

于 2012-04-06T12:26:21.283 回答