c++ - 为矩阵 C++ 重载 "+"运算符

标签 c++

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

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

最佳答案

只是猜测,因为您没有提供头文件...会不会是您忘记在头文件中声明 operator+?

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

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

也看看我的更改:真的很重要,我不再返回引用;这样做会返回 m1(operator += 的结果作为引用),它是一个局部变量,因此您一使用它就会得到一个悬空引用和未定义的行为!

此外,您不会更改 m2,因此您可以轻松地将其作为 const 引用传递(前提是您对类 Matrix 中的 operator+= 进行了相同的更改),这为您提供了更大的灵 active 。

关于c++ - 为矩阵 C++ 重载 "+"运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49172367/

相关文章:

c++ - for 循环只打印一半的值(使用 vector )

c++ - 在 C++11 中,如何在 vector 上调用 std::max?

c++ - 如何通过地址的数值来判断地址合法或非法?

c++ - 我可以存储类型名称吗?

c++ - 如何在 cpp 中使用 std::regex_replace() 函数查找和替换

c++ - Eclipse 处理多个项目

c++ - 永久存储缓冲区值

c++ - glulookat() - 用键盘移动相机(OpenGL)

c++ - 如何声明一个引用变量在条件 block 之间持续存在?

c++ - 为什么 C++ 禁止 new T[n](arg...)?