矩阵C++的重载"+"运算符
Overloading "+" operator for matrices C++
这是我编写的矩阵的简化加法运算符重载,但是当我尝试像这样使用它时,我的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,它不是参考。
还要确保将所有运算符参数作为常量引用获取。
相关文章:
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- C++20概念:需要运算符重载
- 使用赋值运算符重载从类中返回jobject
- 在运算符重载定义中使用成员函数(const错误)
- 字节到位运算符重载C++
- 为什么在运算符重载时需要参考?
- 类中 c++ 的运算符 + 重载
- 算术复合运算符重载为非成员
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 交换运算符 + 重载会导致无限递归
- 如何理解新的运算符重载?
- 向量保持复数的运算符重载
- 如何创建运算符重载?
- 链接列表运算符重载没有打印出我想要的内容
- C++:需要帮助了解运算符重载错误
- 使用模板化运算符重载 XOR 运算符失败
- 如何确保接受的C++模板类型使运算符重载?
- 运算符重载使用运算符+添加类模板