簡體   English   中英

重載矩陣C ++的“ +”運算符

[英]Overloading “+” operator for matrices C++

這是我為矩陣編寫的簡化加法運算符重載,但是當我嘗試像這樣使用它時,我的IDE(Clion)無法識別它: m1 = m2 + m3 ,並說:“二進制運算符+ can '不適用於'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; }

我要在這里解決什么?

PS我還定義了自定義復制和移動構造函數以及一個賦值運算符:

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(作為參考的運算符+ =的結果),這是一個局部變量,因此使用它后,您將獲得懸掛的參考和未定義的行為!

此外,您不會更改m2,因此可以輕松地將其作為const引用傳遞(前提是您對Matrix類中的operator + =進行了相同的更改),這為您提供了更大的靈活性。

首先,您的Matrix全局運算符+不應返回引用,因為在這種情況下,您可以編寫如下代碼:

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

這是病態的。

此外,我猜想這個Matrix& operator + (Matrix m1, Matrix& m2){ return m1+=m2; } Matrix& operator + (Matrix m1, Matrix& m2){ return m1+=m2; }是返回的m1,不是參考。

另外,請確保將所有運算符作為const引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM