13

我有 CMatrix 类,其中是指向值数组的“双指针”。

class CMatrix {
public:
    int rows, cols;
    int **arr;
};

我只需要通过键入以下内容来访问矩阵的值:

CMatrix x;
x[0][0] = 23;

我知道如何使用:

x(0,0) = 23;

但我真的需要以另一种方式做到这一点。任何人都可以帮助我吗?请?

最后感谢大家的帮助,我是这样做的...

class CMatrix {
public:
   int rows, cols;
   int **arr;

public:
   int const* operator[]( int const y ) const
   {
      return &arr[0][y];
   }

   int* operator[]( int const y )
   {
      return &arr[0][y];
   }

   ....

谢谢你的帮助,我真的很感激!

4

5 回答 5

28

您不能重载operator [][],但这里的常用习惯用法是使用代理类,即重载operator []以返回已operator []重载的不同类的实例。例如:

class CMatrix {
public:
    class CRow {
        friend class CMatrix;
    public:
        int& operator[](int col)
        {
            return parent.arr[row][col];
        }
    private:
        CRow(CMatrix &parent_, int row_) : 
            parent(parent_),
            row(row_)
        {}

        CMatrix& parent;
        int row;
    };

    CRow operator[](int row)
    {
        return CRow(*this, row);
    }
private:
    int rows, cols;
    int **arr;
};
于 2013-04-02T11:30:38.823 回答
18

C++中没有operator[][]。但是,您可以重载operator[]以返回另一个结构,并且在该重载中operator[]也可以获得您想要的效果。

于 2013-04-02T11:28:28.270 回答
3

您可以通过重载operator[]返回一个来做到这一点int*,然后由 . 的第二个应用程序对其进行索引[]int*你也可以返回另一个代表行的类,它operator[]可以访问行的各个元素,而不是你。

本质上,operator[] 的后续应用会处理前一个应用的结果。

于 2013-04-02T11:29:51.767 回答
2

如果您使用标准库容器创建矩阵,这很简单:

class Matrix {
    vector<vector<int>> data;

public:
    vector<int>& operator[] (size_t i) { return data[i]; }
};
于 2013-04-02T11:30:47.780 回答
1

你可以operator[]让它返回一个指向相应row or column矩阵的指针。因为指针支持 [ ] 下标,所以可以通过 'double-square' 访问notation [][]

于 2013-04-02T11:29:11.540 回答