Оператор перегрузки С++ [] []
У меня есть класс 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]; }
};