0

我一直在思考这个问题,并没有想出任何有用的东西。我有由 2 个类表示的矩阵:

class CMatrix {
public:
    CMatrixRow * matrix;
    int height, width;
    CMatrix(const int &height, const int &width);
    CMatrix(const CMatrix &other);
    ~CMatrix();
    CMatrixRow operator [] (const int &index) const; 
    ...
}

class CMatrixRow {
public:
    int width;
    CMatrixRow(const int &width);
    CMatrixRow(const CMatrixRow &other);
    ~CMatrixRow();
    double operator [] (const int index) const;
    void operator =(const CMatrixRow &other);
private:
    double * row;

};

其中 CMatrix 是矩阵行 (CMatrixRow) 的容器。当有人试图在其边界之外访问矩阵时,或者换句话说,使用的索引之一大于矩阵的大小时,我需要抛出异常。问题是,我需要以某种方式将第一个索引传递给方法

double operator [] (const int index) const;

因此它可以抛出有关两个索引的信息的异常,无论其中哪一个是错误的。我也想让它尽可能简单。你能想到什么吗?

4

2 回答 2

1

CMatrixRow需要能够找出它在您的容器中的哪一行。一种简单的方法是给CMatrixRow's 的构造函数一个额外的参数,即它的行索引,然后它可以在创建后保留它。但是,这是一种冗余形式,如果您开始四处移动,可能会导致问题CMatrixRow

通常使用operator()两个参数来实现矩阵访问,而不是operator[]通过辅助类来实现。所以,而不是matrix[i][j],你会做matrix(i, j)。这使您的问题变得更加容易,并且还可能导致性能提高。请参阅“为什么我的 Matrix 类的界面不应看起来像一个数组数组?” 了解更多信息。

于 2013-04-05T22:41:17.457 回答
0

最终我设法做到了这样

class CMatrix {
public:
    double ** matrix;
    int height, width, throwFirstIndex;

    class Proxy {
    public:
        Proxy(double * array, const int width, const int rowIndex, bool fail = false);
        double & operator [] (const int &index) const;
    private:
        double * row;
        int width, rowIndex;
        bool fail;
    };

    CMatrix(const int &height, const int &width);
    CMatrix(const CMatrix &other);
    ~CMatrix();
    Proxy operator [] (const int &index) const;
    ...
};

我基本上复制了这个:Operator[][] 重载

于 2013-04-07T18:14:09.947 回答