C ++ оператор перегрузки [] []
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[]
чтобы получить желаемый эффект.
3 плюса
Вы можете сделать это путем перегрузки, operator[]
чтобы вернуть значение int*
, которое затем индексируется вторым приложением []
. Вместо этого int*
вы также можете вернуть другой класс, представляющий строку, который operator[]
предоставляет доступ к отдельным элементам строки.
По существу, последующие приложения оператора [] работают с результатом предыдущего приложения.
Автор: Stefan Dragnev Размещён: 02.04.2013 11:292 плюса
Если вы создаете матрицу с использованием контейнеров стандартной библиотеки, это тривиально:
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 [][]
возможен.
Вопросы из категории :
- c++ What are the barriers to understanding pointers and what can be done to overcome them?
- c++ Какой самый простой способ для анализа файла INI в C ++?
- c++ Когда вы должны использовать «друг» в C ++?
- c++ Как вы очищаете переменную stringstream?
- c++ В C ++ конструктор и деструктор могут быть встроенными функциями?
- matrix Функция транспонирования / распаковки (обратная сторона zip)?
- matrix Как вы вращаете двумерный массив?
- matrix Как мне перебрать каждый элемент в n-мерной матрице в MATLAB?
- matrix Компактная матричная индексация MATLAB
- matrix How do I resize a matrix in MATLAB?
- overloading При переопределении equals в Java, почему не работает использование параметра, отличного от Object?
- overloading Можете ли вы перегружать методы контроллера в ASP.NET MVC?
- overloading Перегрузка функции по типу возврата?
- overloading Перегрузка функций в Javascript - лучшие практики
- overloading Graphics.DrawRectangle (Pen, RectangleF)
- operator-keyword Перегрузка операторов в C ++ как int + obj
- operator-keyword Оператор Haskell против приоритета функции
- operator-keyword Как операторы на месте Python отличаются от стандартных операторных функций?
- operator-keyword Как мне создать и использовать оператор стрелки класса?
- operator-keyword Возможны ли переменные операторы?