C++重载运算符[ ][ ]

4nkexdtk  于 2023-01-28  发布在  其他
关注(0)|答案(7)|浏览(143)

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

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

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

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];
   }

   ....
t2a7ltrp

t2a7ltrp1#

您不能重载operator [][],但这里的常见习惯用法是使用 * 代理类 *,即在Matrix类上重载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;
};
kulphzqa

kulphzqa2#

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

acruukt9

acruukt93#

您可以通过重载operator[]返回一个int*,然后由[]的第二个应用程序进行索引来完成此操作。您还可以返回另一个表示行的类来代替int*,该类的operator[]提供对行中各个元素的访问。
基本上,运算符[]的后续应用程序处理前一个应用程序的结果。

iyr7buue

iyr7buue4#

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

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

public:
    vector<int>& operator[] (size_t i) { return data[i]; }
};
cnjp1d6j

cnjp1d6j5#

C++23中的容器已经添加了对这一点的一些支持:Multidimensional subscript operator
尽管使用的语法是v[x, y, z]而不是v[x][y][z]

voj3qocg

voj3qocg6#

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

mhd8tkvw

mhd8tkvw7#

其他的答案告诉你怎么做,但是...

别这样。

而是重载operator ()

int & operator () ( size_t row, size_t col )
{
  // maybe validate `row` and `col` first?
  return arr[row * cols + col];
}

为什么不呢?
C++常见问题解答解释了这一切。直接从马的嘴里。

  • 如何为Matrix类创建下标运算符?
  • 为什么我的Matrix类的接口看起来不应该像一个数组的数组?
  • 我还是不明白,为什么我的Matrix类的接口不应该看起来像一个数组的数组?
    tl;dr:封装和安全性

相关问题