|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
24.07.2019, 19:07 | #1 |
Форумчанин
Регистрация: 26.03.2010
Сообщений: 538
|
Осмысленный пример с оператором ->
Приветствую!
Кто-нибудь в рамках своей деятельности перегружал оператор -> ? Был бы очень признателен за осмысленный пример. Насколько я понял, этот оператор должен возвращать указатель на структуру или класс, т.е. то, к чему -> можно применить. Код:
При этом, никто не запрещает вернуть -> атомарный тип: Код:
Код:
В связи с этим и хотелось бы узнать сакральный смысл этого оператора и увидеть пример с этим оператором от профи.
Единственный способ стать умнее - играть с более умным противником.
|
24.07.2019, 19:29 | #2 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
smart pointers
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
24.07.2019, 22:27 | #3 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
|
25.07.2019, 06:00 | #4 |
Заблокирован
Регистрация: 17.12.2018
Сообщений: 514
|
Я. Понадобился мне как бы иттератор, но с одной особенностью: он не предназначен для перебора, а заменяет собой указатель только при адресации объекта. Его возвращает функция-член контейнера, а потом вызывающий код может многократно обращаться по этому манипулятору только к одному элементу, но не может перебирать контейнер. Вызывающий код – это кэейс в оконной процедуре, он работает лишь с одним объектом, связанным с конкретным окном. Альтернативной будет хранение указателя в cbWndExtra. Во-первых, указатель окажется не завёрнут. А во-вторых, это ещё и полумера. Объект сам является контейнером контейнеров объектов и имеет состояние, в зависимости от которого нужен определённый элемент определённого элемента. И за выбор элемента самого объекта и элемента элемента отвечает окно другого класса. Перебирать ничего не надо и там, это произвольный доступ по выбору пользователя и ровно в одно место за весь процесс обработки сообщения. А делать с элементом элемента надо много чего и много раз. Можно было бы вернуть ссылку, как из оператора []. Можно даже бросать и обрабатывать исключение out_of_index. Но тогда гонять функцию-член придётся при каждом обращении к главному контейнеру, а в нём лежит двусвязный циклический список, пришлось бы каждый раз искать в списке. Поэтому нужна некая обёртка над указателем, но не иттератор и даже не «умный» указатель, данная сущность не предназначена для управления временем существования объекта, на который указывает. Иттератор перебирает контейнеры, а «умный» указатель занимается отслеживанием количества связей с объектом. А мне не нужно ни то, ни другое. Во избежание путаницы о назначении данной сущности, нужен настоящий манипулятор, в котором не будет предусмотрено ничего лишнего. Умный указатель с минимальным интерфейсом и минимальной функциональностью. Без счётчика. А в std само понятие манипулятора другое, это не ещё один вариант умного указателя, а объект, при выводе которого в поток с потоком что-то происходит. Например, меняется основание системы счисления, или поток принудительно переводится на следующую строку. Пришлось писать. Но кроме невозможности инкремента, декремента, произвольного присваивания откуда попало, вычисления разности адресов и применения в delete, в остальном эта сущность должна вести себя как указатель. И для обращения к полям адресуемого манипулятором объекта пришлось перегрузить ->. Поиск в списке всё равно выполняется при каждом обращении к главному контейнеру, но не к его элементам, не к элементам его элементов и не к элементам элементов его элементов. А к главному контейнеру обращения происходят реже, ровно один раз за всю обработку сообщения, да ещё и не каждого, а только при обработке сообщений некоторых видов. И при этом ещё и единобезобразие достигнуто: нет использования cbWndExtra для хранения указателя на элемент главного контейнера и отдельно какого-то решения для адресации элементов элементов главного контейнера и элементов элементов элементов главного контейнера. Это вполне реальный проект. Редактор многослойных схем вязания.
Последний раз редактировалось taras-proger77; 25.07.2019 в 06:13. |
25.07.2019, 08:21 | #5 |
Пользователь
Регистрация: 23.07.2019
Сообщений: 14
|
Брюс Эккель.
Философия С++. 2-е издание - СПб.: Питер, 2004. Оператор разыменования указателя. Стр. 374. |
25.07.2019, 12:57 | #6 |
Форумчанин
Регистрация: 26.03.2010
Сообщений: 538
|
Благодарю всех за ответы. Теперь стало понятно.
Но остался вопрос. Правильно ли я понимаю, что оператор -> может возвращать только указатель на структуру/класс с public полями или методами или класс/структуру по значению/ссылке, для которых также определен оператор ->. А возврат атомарного типа (int, double и т.д.) смысла не имеет, хоть компилятор и позволяет такой оператор реализовать ?
Единственный способ стать умнее - играть с более умным противником.
|
25.07.2019, 19:36 | #7 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
оператор -> (как и любой другой оператор) может возвращать все, что может возвращать любая функция/метод.
|
25.07.2019, 19:50 | #8 | |
Форумчанин
Регистрация: 26.03.2010
Сообщений: 538
|
Цитата:
Код:
Я так понял, что для использования -> в привычном виде надо, чтобы то, что возвращает этот оператор также поддерживало обращение по ->. Иначе нужно вызывать через .operator и весь смысл перегрузки теряется. В этом случае лучше уж сделать какой-нибудь метод.
Единственный способ стать умнее - играть с более умным противником.
Последний раз редактировалось Sam Gold; 25.07.2019 в 20:07. |
|
30.07.2019, 08:22 | #9 |
Заблокирован
Регистрация: 17.12.2018
Сообщений: 514
|
Зачем?
Последний раз редактировалось taras-proger77; 30.07.2019 в 08:26. |
01.08.2019, 22:18 | #10 |
Форумчанин
Регистрация: 26.03.2010
Сообщений: 538
|
Единственный способ стать умнее - играть с более умным противником.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
как из файла "Пример Меню" не очень подкованный пользователь сможет сделать файл устроенный так же как "Пример импорта" | qaws | Помощь студентам | 2 | 10.09.2016 14:49 |
Расчет с оператором if | Fahman | Общие вопросы Delphi | 10 | 06.11.2015 18:14 |
код с оператором in на паскале | 3Doleg | Общие вопросы C/C++ | 1 | 18.03.2013 00:41 |
Задача с оператором for | Artem111999 | Помощь студентам | 1 | 15.03.2013 19:41 |
проблема с оператором for | vakyla | Общие вопросы Delphi | 9 | 24.03.2009 20:07 |