我有自定义类,其行为类似于矩阵。除了从同一个类的其他实例中分配值之外,一切都运行良好。
所以我可以这样做:
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;
};
答案 0 :(得分:1)
您目前有一个operator[]
签名:
Proxy operator[](Matrix *this, int i)
你试着这样说:
Proxy operator[](const Matrix *, int)
错误在于,为了从const Matrix *
转换为Matrix *
,必须丢弃const
,这很糟糕。您应该在班级内提供const
版本:
Proxy operator[](int) const {...}
当你进入你的班级时,它会获得第一个参数this
,参数列表后面的const
意味着第一个参数将是指向你班级的常量对象的指针,而不是非常数。