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

c++ matrix overloading operator-keyword

14813 просмотра

5 ответа

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

   ....

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

Автор: Tomas Sykora Источник Размещён: 12.11.2019 09:55

Ответы (5)


24 плюса

Вы не можете перегрузить 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;
};
Автор: unkulunkulu Размещён: 02.04.2013 11:30

18 плюса

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

Автор: Some programmer dude Размещён: 02.04.2013 11:28

3 плюса

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

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

Автор: Stefan Dragnev Размещён: 02.04.2013 11:29

2 плюса

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

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

public:
    vector<int>& operator[] (size_t i) { return data[i]; }
};
Автор: Bartek Banachewicz Размещён: 02.04.2013 11:30

1 плюс

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

Автор: Iulian Rosca Размещён: 02.04.2013 11:29
Вопросы из категории :
32x32