0

我有一个重载的类[],当我尝试将值设置为数组时,我需要让它识别。我假设,我将不得不重载 operator =,但我不知道,整个东西会是什么样子。我的部分代码:

class Matrix {
public:

Matrix(int x, int y);
~Matrix(void);
Matrix& operator =(const Matrix &matrix); //ok...this is probably wrong...

class Proxy {
public:

    Proxy(double* _array) : _array(_array) {
    }

    double &operator[](int index) const {
        return _array[index];
    }

private:
    double* _array;
};

Proxy operator[](int index) const {
    return Proxy(_arrayofarrays[index]);
}

Proxy operator[](int index) {
    return Proxy(_arrayofarrays[index]);
}

int x, y;
double** _arrayofarrays;
};

所以我只需要能够识别我何时尝试设置Matrix matrix(3,3); matrix[0][0]=1; 其他一切都可以正常工作,所以我认为不需要粘贴整个代码

4

2 回答 2

2

看起来您想要一些无法直接实现的东西: operator[][].

您可以通过使用中间类来模拟此行为:
由于 Matrix 类通常被索引为 [rows][columns],因此您可以
让第一个运算符方法返回相应的 Row 对象。
行类可以重载 operator[] 并返回相应的
元素。

Row& Matrix::operator[](int r);  
double& Row::operator[](int c);

现在,当您创建矩阵对象时,您可以按预期对其进行索引:

Matrix matrix(3,3);  
matrix[0][0] = 1;

最后一行相当于调用:

matrix.operator[](0).operator[](0) = 1;

要检查越界索引,请存储矩阵大小:

Proxy operator[](int index) {
    assert(index < num_rows);
    return Proxy(_arrayofarrays[index]);
}

double &operator[](int index) const {
    assert(index < num_cols);
    return _array[index];
}

正如 Aldo 建议的那样,Proxy 可以在其构造函数中传递数组长度值:

 Proxy(double* _array, int _length) : _array(_array), num_cols(_length){
 }

作为一般经验法则,如果您将原始数组传递给函数,您几乎总是希望传递该数组的长度。

于 2013-04-02T19:09:31.810 回答
1

您的Proxy::operator[]重载正在返回一个double&. 这double&是最终将由客户端代码分配的对象,您不能拦截它(至少不容易)。可能您需要做的是检查重载中的index参数operator[],并在那里抛出您自己的异常,而不是将该索引传递给您的内部数组。

于 2013-04-02T19:02:47.097 回答