[英]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.