0

マトリックスのように動作するカスタム クラスがあります。同じクラスの他のインスタンスから値を割り当てることを除いて、すべてがうまく機能します。

だから私は次のようなことができます:

Matrix a(5,7);
// du stuff with a
Matrix b(5,7);
Matrix d=a+b;
d=a*5;
d[3][2]=1;

//but I can't do this:
double x=d[3][2];

//at this point I get this error:

main.cpp:604:12: error: passing ‘const Matrix’ as ‘this’ argument of ‘Matrix::Proxy Matrix::operator[](int)’ discards qualifiers

これを修正する方法はありますか?:(

私のマトリックスクラスの実装は次のとおりです。

class Matrix {
public:

Matrix(int x, int y);
~Matrix(void);
//overloaded operators
Matrix operator+(const Matrix &matrix) const;  
Matrix operator-() const;
Matrix operator-(const Matrix &matrix) const; 
Matrix operator*(const double x) const; 
Matrix operator*(const Matrix &matrix) const; 

friend istream& operator>>(istream &in, Matrix& a);

class Proxy {
    Matrix& _a;
    int _i;
public:

    Proxy(Matrix& a, int i) : _a(a), _i(i) {

    }

    double& operator[](int j) {
        return _a._arrayofarrays[_i][j];
    }
};

Proxy operator[](int i) {
    return Proxy(*this, i);
}

// copy constructor

Matrix(const Matrix& other) : _arrayofarrays() {
    _arrayofarrays = new double*[other.x ];
    for (int i = 0; i != other.x; i++)
        _arrayofarrays[i] = new double[other.y];

    for (int i = 0; i != other.x; i++)

        for (int j = 0; j != other.y; j++)
            _arrayofarrays[i][j] = other._arrayofarrays[i][j];

    x = other.x;
    y = other.y;
}
int x, y;
double** _arrayofarrays;
};
4

1 に答える 1

1

現在、あなたは 1 つのoperator[]署名を持っています:

Proxy operator[](Matrix *this, int i)

あなたはこれを呼び出そうとしています:

Proxy operator[](const Matrix *, int)

エラーは、からconst Matrix *に変換するために を破棄する必要があることを示していますが、これは悪いことです。クラス内でバージョンを提供する必要があります。Matrix *constconst

Proxy operator[](int) const {...}

クラス内では、 の最初のパラメーターを取得します。パラメーター リストthisconst後の は、最初のパラメーターが非定数オブジェクトではなく、クラスの定数オブジェクトへのポインターになることを意味します。

于 2013-04-06T00:37:32.237 に答える