Оператор перегрузки С++ [] []

У меня есть класс 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];
   }

   ....

Спасибо за вашу помощь. Я действительно ценю это!

Ответ 1

Вы не можете перегрузить 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;
};

Ответ 2

В С++ нет operator[][]. Однако вы можете перегрузить operator[], чтобы вернуть другую структуру, и в этой перегрузке operator[] тоже получить желаемый эффект.

Ответ 3

Вы можете сделать это, перегрузив operator[], чтобы вернуть int*, который затем индексируется вторым приложением []. Вместо int* вы также можете вернуть другой класс, представляющий строку, чей operator[] предоставляет доступ к отдельным элементам строки.

По существу, последующие приложения оператора [] работают с результатом предыдущего приложения.

Ответ 4

Вы можете operator[] и заставить его вернуть указатель на соответствующую row or column матрицы. Поскольку указатели поддерживают подпитку с помощью [], тогда возможен доступ к "двойному квадрату" notation [][].

Ответ 5

Если вы создаете матрицу с использованием контейнеров стандартной библиотеки, она тривиальна:

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

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