copy constructor error: the object has type qualifiers that are not compatible with the member function

copy constructor error: the object has type qualifiers that are not compatible with the member function

我正在使用简单的二维数组,但在我的复制构造函数中遇到了问题。 这是我的代码的摘录:

//default constructor
Matrix::Matrix(int r, int c)
{
    rows = r;
    cols = c;
    mainArray = new int[rows*cols];
    array = new int *[rows];
    for (int i = 0; i < rows; i++)
        array[i] = mainArray + (i*cols);
}
//at member
int& Matrix::at(int i, int j)
{
    return array[i][j];
}
//copy constructor 
Matrix::Matrix(const Matrix & obj)
{
    rows = obj.rows;
    cols = obj.cols;
    mainArray = new int[rows*cols];
    array = new int *[rows];
    for (int i = 0; i < rows; i++)
        array[i] = mainArray + (i*cols);
    }
    for (int i = 0; i < obj.rows; i++)
    {
        for (int j = 0; j < obj.cols; j++)
            at(i, j) =obj.at(i,j);//PROBLEM
    }
}

当我尝试分配 at(i,j)=obj.at(i,j) 时,我得到了这个: 该对象具有与成员函数不兼容的类型限定符

据我所知,复制构造函数应该由 (const class& obj) 传递。 我该怎么办?

实现两个版本的at函数,一个const和一个non-const.

int& Matrix::at(int i, int j)
{
    return array[i][j];
}

int Matrix::at(int i, int j) const
{
    return array[i][j];
}

那是因为你的复制构造函数有一个const参数,而你的方法Matrix::at不是const。

我建议你做两种版本的 at 方法,一种是 const,一种不是 :

// Use for assignement
int& Matrix::at(int i, int j)
{
    return array[i][j];
}

// Use for reading
int Matrix::at(int i, int j) const
{
    return array[i][j];
}

您的编译器应该知道在哪种情况下在没有您帮助的情况下调用哪个,具体取决于您是尝试修改还是只是读取您的实例:

Matrix matrix(4, 4);

matrix.at(1, 2) = 42; // Assignement method called
int i = matrix.at(1, 2); // Read method called