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

时间:2018-01-15 13:48:12

标签: c++ class segmentation-fault operator-overloading

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

N = N + M;

其中N和M是Matrix类的对象:

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)
{ }

1 个答案:

答案 0 :(得分:0)

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

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;