|
0 / 0 / 1
Регистрация: 22.02.2013
Сообщений: 9
|
|||||||||||||
Перегрузка двойного индексного оператора26.02.2013, 15:25. Показов 5425. Ответов 10
Метки нет (Все метки)
Делаю задачу из одной книги. Нужно создать класс DoubleSubscriptedArray.Как видно из названия, класс должен работать с двумерными массивами. Он включает несколько задач, связанных с перегрузкой операторов, но это не столь важно. Реализация всего этого не вызывает у меня затруднений, тем более, что в предшествующем разделе книги есть аналогичный пример для одномерного массива
![]() Но в отличие от примера, новый класс должен работать с двумерными массивами, и обращение к элементам массива должно производиться посредством перегруженного оператора (), в такой форме: DoubleSubscriptedArray( row, column ) вместо: DoubleSubscriptedArray[ row ] [ column ] Так вот, с реализацией варианта с оператором () все понятно. Гораздо интереснее реализовать обращение в стандартном формате [ ] [ ]. Но при потпытках это провернуть, возник вопрос: "Возможно ли это вообще сделать?". Сам двумерный массив у меня реализуется при помощи массива указателей:
Теперь нужно сделать так, чтобы к элементам объекта класса можно было обращаться в таком-же формате. Надо перегружать оператор [ ]. Появляется вопрос: "Как он вообще работает?".
С моим массивом указателей происходит немного по-другому. Если, к примеру, ptr[ 1 ][ 2 ], происходит вот такое: *( *( ptr + 1 ) + 2 ) Насколько я понимаю, ptr содержит адрес элемента матрицы [ 0 ][ 0 ]. К нему прибавляем значение смещения x, и получаем адрес указателя на элемент [ x ] [ 0 ]. Разыменовываем, получаем сам указатель на элемент [ x ] [ 0 ], к нему прибавляем второе смещение y и получаем адрес элемента матрицы [ x ] [ y ], разыменовываем его, и получаем уже само значение элемента в формате int. Как-то так, насколько я смог разобраться. Это работает. Дальше "самое простое" - перегрузить соответствующим образом оператор [ ]. Для одномерного массива все просто как доска: int &Array::operator[]( int subscript ) { if( subscript < 0 || subscript >= size ) throw out_of_range( "Subscript out of range" ); return *(ptr + subscript ); } Возвращаем уже готовый, разыменованный указатель, значение int, lvalue. Здесь не массив указателей, просто указатель *ptr. С двумерным так сделать не получится. Во-первых, оператор [] принимает только один параметр. Значит, передать туда адреса двух смещений сразу не получится. Надо как-то разделять, что-то запоминать. К примеру, ptr[ 1 ][ 2 ], при первом вызове вычислит ptr[ 1 ], запомнит его, а при втором вызове прибавит [ 2 ], и возвратит результат. Все бы хорошо, но тип возвращаемого значения, как не крути, должен оказаться в конце int &. Получается, что при первом вызове возвращается значение типа int, а дальше попытка вычислить выражение типа int[int], что приводит к ошибке: invalid types `int[int]' for array subscript То есть, каскадирование не работает. И ничего придумать не получится. Изменить тип возвращаемого значения на какой-нибудь DoubleSubscriptedArray &? Но в конце-концов все равно должен быть int &, то есть значение элемента по заданному адресу, а не объект. Да и как вообще это все будет работать. То есть, получается, это невозможно реализовать? Как тогда [][] работает со стандартными массивами? Вероятно, так как в англоязычном примере, приводимом мной выше. Во время написания поста у меня появилась мысль, на счет неправильности использования массива указателей, но какая альтернатива? Буду очень благодарен за любую помощь. Не знаю, насколько понятно удалось это все описать, надеюсь что достаточно подробно. Да, и еще: я не совсем уверен, что это тема для новичков. Прав создания тем в разделе для экспертов у меня нету. Возможно, модератор согласился-бы перенести эту тему туда? Мне кажется, там ей место.
0
|
|||||||||||||
| 26.02.2013, 15:25 | |
|
Ответы с готовыми решениями:
10
Перегрузка оператора * Перегрузка оператора |
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
||||||
| 26.02.2013, 15:36 | ||||||
|
Ключевой кусок кода:
1
|
||||||
|
0 / 0 / 1
Регистрация: 22.02.2013
Сообщений: 9
|
|
| 26.02.2013, 15:39 [ТС] | |
|
интересно, вечером разберусь. думаю, это немного выходит за рамки рассматриваемого раздела книги, но попробую прикрутить к своему классу.
0
|
|
|
|
||||||
| 26.02.2013, 17:38 | ||||||
|
Для вашего случая рискну предложить такой вариант:
0
|
||||||
|
|
|
| 26.02.2013, 17:49 | |
|
2
|
|
|
0 / 0 / 1
Регистрация: 22.02.2013
Сообщений: 9
|
|||
| 26.02.2013, 22:06 [ТС] | |||
возвращаемый тип - int *. Возвращается указатель, содержащий адресс строки [indx], а потом ошибка invalid types `int[int]' for array subscript. Да и в конце должен быть разыменованный указатель.Добавлено через 1 минуту Добавлено через 58 секунд Вариант CheshireCat очень туманен и непонятен, не могу разобраться.
0
|
|||
|
0 / 0 / 1
Регистрация: 22.02.2013
Сообщений: 9
|
|||||||||||
| 26.02.2013, 22:40 [ТС] | |||||||||||
И как оно будет работать на практике, какой принцип - в двух словах? Обработка выражения типа array[x][y] - как я понимаю, сначало, при обработке array[x], должно вернуть проинициализорованный объект хелпера, в переменной
Только что разобрался
0
|
|||||||||||
|
Каратель
|
|
| 26.02.2013, 22:42 | |
|
1
|
|
|
0 / 0 / 1
Регистрация: 22.02.2013
Сообщений: 9
|
|
| 26.02.2013, 22:56 [ТС] | |
|
там ведь определение класса должно быть вроде.
ну ничего, главное что основной принцип понял. да, с двумерными должно сработать, но если уже 3d и больше - надо будет переделывать.
0
|
|
|
|
|
| 27.02.2013, 00:34 | |
|
0
|
|
| 27.02.2013, 00:34 | |
|
Помогаю со студенческими работами здесь
11
Перегрузка оператора - Перегрузка оператора !=
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
||||
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Сочетание глобально распределённой вычислительной мощности и инновационных. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|