Форум программистов, компьютерный форум CyberForum.ru

Перегрузка оператора индексации - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,588
Записей в блоге: 17
16.05.2012, 15:04     Перегрузка оператора индексации #1
Можно ли зоздать в своем классе перегрузку оператора [], но с двойными скобками вроде?

C++
1
int &operator[][](int m,int n) { /*.....*/}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.05.2012, 15:18     Перегрузка оператора индексации #2
Avazart, Нет.
Но есть обходные возможности.
1) Возвращать указатель.
2) Реализовать прокси-класс в котором хранить данные, перегрузить в нем оператор [], хранить в вашем классе массив таких объектов, при вызове возвращать объект.

Добавлено через 5 минут
Пример.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <vector>
 
class Vector
{
public:
   Vector(const std::vector<int>& v):vec(v)
   {
   }
   int& operator [](const int idx) { return vec[idx]; }
private:
   std::vector<int> vec;
};
 
class Matrix
{
public:
   Matrix(const std::vector<Vector>& m):matr(m)
   {
   }
   Vector& operator [](const int idx) { return matr[idx]; }
private:
   std::vector<Vector> matr;
};
 
int main()
{
   std::vector<Vector> vec = std::vector<Vector>
   {
      Vector({1,2,3,4,5}),
      Vector({6,7,8,9})
   };
   Matrix matr(vec);
   std::cout << matr[0][0] << std::endl;
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
16.05.2012, 15:19     Перегрузка оператора индексации #3
По моему в таком случае удобнее перегрузить operator ().
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.05.2012, 15:24     Перегрузка оператора индексации #4
gray_fox, Смотря какой желателен синтаксис.
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,588
Записей в блоге: 17
16.05.2012, 15:37  [ТС]     Перегрузка оператора индексации #5
Avazart, Нет.
Но есть обходные возможности
Да понятно без костылей не как...
Странно что язык не предусматриват такой возможности...
И в тоже время существуют многомерные массивы...
Jupiter
16.05.2012, 16:33
  #6

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
И в тоже время существуют многомерные массивы...
считайте это синтаксическим сахаром

Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,588
Записей в блоге: 17
23.05.2012, 16:50  [ТС]     Перегрузка оператора индексации #7
Скорее за анизотропию.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
23.05.2012, 17:32     Перегрузка оператора индексации #8
Цитата Сообщение от Avazart Посмотреть сообщение
И в тоже время существуют многомерные массивы...
Это просто сахар, как сказали выше.
Точнее, сахар заключается в удобном создании этих массивов.
Оператора [][] и прочего у этих массивов нету. Ибо двумерный массив - это массив указателей.
Например
C++
1
2
3
int matrix[3][3]; 
int *row = matrix[2];
row[2]; //эквивалент matrix[2][2]
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,588
Записей в блоге: 17
23.05.2012, 17:42  [ТС]     Перегрузка оператора индексации #9
C++
1
int matrix[3][3];
Я всегда считал эквивалентен по размещению
C++
1
int matrix[3*3];
Ну да ладно основную идею понял
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
23.05.2012, 18:23     Перегрузка оператора индексации #10
интересно а если выделить память так
C++
1
int (*n)[10]= malloc(sizeof(int) * 10 *5)
а обратится
C++
1
n[0][0]=0;
ведь следуя из этого

Цитата Сообщение от diagon Посмотреть сообщение
Ибо двумерный массив - это массив указателей
должна произойти ошибка обращения к памяти , я прав?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
23.05.2012, 18:33     Перегрузка оператора индексации #11
Цитата Сообщение от Van111 Посмотреть сообщение
int (*n)[10]= malloc(sizeof(int) * 10 *5)
Вы тут память под указатели выделяете, а вот под то, на что они указывают - нет.
Поэтому да, будет ошибка обращения к памяти.
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,588
Записей в блоге: 17
23.05.2012, 18:43  [ТС]     Перегрузка оператора индексации #12
C++
1
int matrix[3][3];
И
C++
1
2
int *row = matrix[2];
row[2]; //эквивалент matrix[2][2]
Разные типы массивы...
Первый не является массивом указателей как я понимаю...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2012, 18:46     Перегрузка оператора индексации
Еще ссылки по теме:

перегрузка оператора индексации в списке C++
Перегрузка оператора индексации в одном классе и использование в другом C++
C++ Перегрузка оператора индексации для класса плохо себя ведёт

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
23.05.2012, 18:46     Перегрузка оператора индексации #13
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
int matrix[3][3];
И
C++
1
2
int *row = matrix[2];
row[2]; //эквивалент matrix[2][2]
Разные типы массивы...
Первый не является массивом указателей как я понимаю...
Это все один код был.
Суть в том, что matrix[2] - указатель.
Можно даже так писать
C++
1
(matrix[2])[2];
Yandex
Объявления
23.05.2012, 18:46     Перегрузка оператора индексации
Ответ Создать тему
Опции темы

Текущее время: 19:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru