矩阵C++的重载"+"运算符

Overloading "+" operator for matrices C++

本文关键字:运算符 重载 C++ 矩阵      更新时间:2023-10-16

这是我编写的矩阵的简化加法运算符重载,但是当我尝试像这样使用它时,我的IDE(Clion(无法识别它: m1 = m2 + m3 ,并说:"二进制运算符 + 不能应用于类型'矩阵'和'矩阵'的表达式">

Matrix& Matrix::operator += (Matrix& m1)
{
    for (int i = 0; i < m_rows; ++i)
        for (int j = 0; j < m_cols; ++j)
            m_matrix[i][j] += m1.m_matrix[i][j];
    return *this;
}
Matrix& operator + (Matrix m1, Matrix& m2){ return m1+=m2; }

我必须在这里解决什么问题?

附言我还定义了自定义复制和移动构造函数以及赋值运算符:

Matrix::Matrix(const Matrix& m1)
    : m_matrix{new double*[m1.rows()]},
      m_rows{m1.rows()},
      m_cols{m1.cols()}
{
    for (int i = 0; i < m1.rows(); ++i) {
        m_matrix[i] = new double[m1.cols()];
        for (int j = 0; j < m1.cols(); ++j)
            m_matrix[i][j] = m1.m_matrix[i][j];
    }
}
Matrix& Matrix::operator = (const Matrix& m1){
    Matrix matrix(m1.rows(), m1.cols());
    for (int i = 0; i < m1.rows(); ++i)
        for (int j = 0; j < m1.cols(); ++j)
            matrix.m_matrix[i][j] = m1.m_matrix[i][j];
    for (int i = 0; i < m_rows; ++i)
        delete m_matrix[i];
    delete m_matrix;
    m_matrix = matrix.m_matrix;
    m_rows = m1.rows();
    m_cols = m1.cols();
    return *this;
}
Matrix::Matrix(Matrix&& m1) noexcept
    : m_matrix{m1.m_matrix},
      m_rows{m1.m_rows},
      m_cols{m1.m_cols}
{
    for (int i = 0; i < m1.m_rows; ++i)
        delete m1.m_matrix[i];
    delete m1.m_matrix;
    m1.m_rows = m1.m_cols = 0;
}

只是猜测,因为您没有提供头文件...会不会是你忘了在头文件中声明运算符+?

class Matrix
{
    // ...
};
Matrix operator+ (Matrix m1, Matrix const& m2); // just declared, not implemented!

如果是这样,您只能在 Matrix 实现文件中使用该运算符(并且只能在实现之后(,因为它在其他地方根本不为人所知......

也看看我的更改:真的很重要,我不再返回引用;这样做会返回 m1(运算符 += 的结果作为引用(,这是一个局部变量,所以你得到一个悬空的引用和未定义的行为一旦使用它!

此外,您

不会更改 m2,因此您可以轻松地将其作为 const 引用传递(前提是您在类 Matrix 中对运算符+= 执行相同的更改(,这为您提供了更大的灵活性。

首先,你的全局运算符 + for Matrix 不应该返回引用,因为在这种情况下你可以像这样写 smth:

Matrix m1,m2,m3;
m1+m2=m3;

这是不成熟的。

此外,我想这个Matrix& operator + (Matrix m1, Matrix& m2){ return m1+=m2; }是一个返回的 m1,它不是参考。

还要确保将所有运算符参数作为常量引用获取。