使用重载运算符时出现分段错误



我的代码中的以下行导致了一个神秘的段错误:

N = N + M;

其中 N 和 M 是矩阵类的对象:

class Matrix {
vector<int> A; 
int m, n;
}

+ 操作员功能:

Matrix Matrix::operator+(const Matrix &other){
//matrices must be of same dimensions
//if not, return null Matrix
if (m != other.m || n != other.n)
return Matrix(0, 0);
Matrix T(m, n);
for (int i = 0; i < m*n; i++){
T.A.at(i) = this->A.at(i) + other.A.at(i);
}
return T;
}

当然,N 和 M 的大小相同 (3x3)。

即使这样,也会出现段错误:

M = N + M;

M = M + N;

Matrix P;
P = M + N;

不是

Matrix P = M + N;

我的错误可能是什么?我是C++新手。

编辑:这是=运算符:

Matrix Matrix::operator=(const Matrix &other){
A = other.A;
m = other.m, n = other.n;
}

编辑2:我的构造函数会有所帮助

Matrix::Matrix(int r, int c):
m(r), n(c), A(r*c)
{ }

我认为问题出在您的赋值运算符上:

Matrix Matrix::operator=(const Matrix &other){
A = other.A;
m = other.m, n = other.n;
}

您将其声明为返回Matrix对象,但实际上并不返回任何内容。

解决方案(请注意,返回类型现在是一个引用):

Matrix &Matrix::operator=(const Matrix &other){
A = other.A;
m = other.m, n = other.n;
return *this;
}

请注意,默认编译器生成的赋值无论如何都会做正确的事情。所以更好的解决方案是使用该解决方案(在类声明中):

Matrix &operator=(const Matrix &other) = default;

相关内容

  • 没有找到相关文章

最新更新