Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 24.07.2019, 20:07   #1
Sam Gold
Участник клуба
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Адрес: Город Святого Петра
Сообщений: 538
Репутация: 263
По умолчанию Осмысленный пример с оператором ->

Приветствую!

Кто-нибудь в рамках своей деятельности перегружал оператор -> ? Был бы очень признателен за осмысленный пример.

Насколько я понял, этот оператор должен возвращать указатель на структуру или класс, т.е. то, к чему -> можно применить.

Код:
struct AA
{
	int a;
	int b;
};

class A
{
private:
	int val;
	AA a;

public:
	A() { this->val = 0; a.a = 1; a.b = 2; }
	A(int Val) { this->val = Val; a.a = 3; a.b = 3;}
	AA* operator->() { return &(this->a); }
};
...
A a(7);
int res = a->b;
Однако, на мой взгляд, такой пример выглядит как-то искусственно.

При этом, никто не запрещает вернуть -> атомарный тип:
Код:
class A
{
private:
	int val;
	AA a;

public:
        ...
	int operator->() { return this->val; }
};
Однако вызов такого оператора выглядит еще ужаснее:
Код:
A a(7);
int res = a.operator->();
Смысл перегрузки здесь теряется вовсе.

В связи с этим и хотелось бы узнать сакральный смысл этого оператора и
увидеть пример с этим оператором от профи.
__________________
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума   Ответить с цитированием
Старый 24.07.2019, 20:29   #2
Alex11223
Модератор
Заслуженный модератор
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,293
Репутация: 3739

icq: 512-765
skype: alexp.frl
По умолчанию

smart pointers
Alex11223 на форуме   Ответить с цитированием
Старый 24.07.2019, 23:27   #3
_Bers
Профессионал
 
Регистрация: 16.12.2011
Адрес: Москва
Сообщений: 2,324
Репутация: 1138
По умолчанию

Цитата:
Сообщение от Sam Gold Посмотреть сообщение
Был бы очень признателен за осмысленный пример.
http://www.cplusplus.com/reference/m.../operator-%3E/
_Bers вне форума   Ответить с цитированием
Старый 25.07.2019, 07:00   #4
taras-proger77
Форумчанин
 
Регистрация: 17.12.2018
Сообщений: 419
Репутация: -121
По умолчанию

Цитата:
Сообщение от Sam Gold Посмотреть сообщение
Кто-нибудь в рамках своей деятельности перегружал оператор ->
Я. Понадобился мне как бы иттератор, но с одной особенностью: он не предназначен для перебора, а заменяет собой указатель только при адресации объекта. Его возвращает функция-член контейнера, а потом вызывающий код может многократно обращаться по этому манипулятору только к одному элементу, но не может перебирать контейнер. Вызывающий код – это кэейс в оконной процедуре, он работает лишь с одним объектом, связанным с конкретным окном. Альтернативной будет хранение указателя в cbWndExtra. Во-первых, указатель окажется не завёрнут. А во-вторых, это ещё и полумера. Объект сам является контейнером контейнеров объектов и имеет состояние, в зависимости от которого нужен определённый элемент определённого элемента. И за выбор элемента самого объекта и элемента элемента отвечает окно другого класса. Перебирать ничего не надо и там, это произвольный доступ по выбору пользователя и ровно в одно место за весь процесс обработки сообщения. А делать с элементом элемента надо много чего и много раз. Можно было бы вернуть ссылку, как из оператора []. Можно даже бросать и обрабатывать исключение out_of_index. Но тогда гонять функцию-член придётся при каждом обращении к главному контейнеру, а в нём лежит двусвязный циклический список, пришлось бы каждый раз искать в списке. Поэтому нужна некая обёртка над указателем, но не иттератор и даже не «умный» указатель, данная сущность не предназначена для управления временем существования объекта, на который указывает. Иттератор перебирает контейнеры, а «умный» указатель занимается отслеживанием количества связей с объектом. А мне не нужно ни то, ни другое. Во избежание путаницы о назначении данной сущности, нужен настоящий манипулятор, в котором не будет предусмотрено ничего лишнего. Умный указатель с минимальным интерфейсом и минимальной функциональностью. Без счётчика. А в std само понятие манипулятора другое, это не ещё один вариант умного указателя, а объект, при выводе которого в поток с потоком что-то происходит. Например, меняется основание системы счисления, или поток принудительно переводится на следующую строку. Пришлось писать. Но кроме невозможности инкремента, декремента, произвольного присваивания откуда попало, вычисления разности адресов и применения в delete, в остальном эта сущность должна вести себя как указатель. И для обращения к полям адресуемого манипулятором объекта пришлось перегрузить ->. Поиск в списке всё равно выполняется при каждом обращении к главному контейнеру, но не к его элементам, не к элементам его элементов и не к элементам элементов его элементов. А к главному контейнеру обращения происходят реже, ровно один раз за всю обработку сообщения, да ещё и не каждого, а только при обработке сообщений некоторых видов. И при этом ещё и единобезобразие достигнуто: нет использования cbWndExtra для хранения указателя на элемент главного контейнера и отдельно какого-то решения для адресации элементов элементов главного контейнера и элементов элементов элементов главного контейнера. Это вполне реальный проект. Редактор многослойных схем вязания.

Последний раз редактировалось taras-proger77; 25.07.2019 в 07:13.
taras-proger77 вне форума   Ответить с цитированием
Старый 25.07.2019, 09:21   #5
Viktor_AE
Пользователь
 
Регистрация: 23.07.2019
Сообщений: 14
Репутация: 26
По умолчанию

Брюс Эккель.
Философия С++. 2-е издание - СПб.: Питер, 2004.

Оператор разыменования указателя. Стр. 374.
Viktor_AE вне форума   Ответить с цитированием
Старый 25.07.2019, 13:57   #6
Sam Gold
Участник клуба
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Адрес: Город Святого Петра
Сообщений: 538
Репутация: 263
По умолчанию

Благодарю всех за ответы. Теперь стало понятно.

Но остался вопрос. Правильно ли я понимаю, что оператор -> может возвращать только указатель на структуру/класс с public полями или методами или класс/структуру по значению/ссылке, для которых также определен оператор ->. А возврат атомарного типа (int, double и т.д.) смысла не имеет, хоть компилятор и позволяет такой оператор реализовать ?
__________________
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума   Ответить с цитированием
Старый 25.07.2019, 20:36   #7
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,928
Репутация: 1937
По умолчанию

оператор -> (как и любой другой оператор) может возвращать все, что может возвращать любая функция/метод.
waleri вне форума   Ответить с цитированием
Старый 25.07.2019, 20:50   #8
Sam Gold
Участник клуба
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Адрес: Город Святого Петра
Сообщений: 538
Репутация: 263
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
оператор -> (как и любой другой оператор) может возвращать все, что может возвращать любая функция/метод.
Может, только смысла особого не имеет и его придется вызывать монструозной конструкцией
Код:
int res = a.operator->();
UPD:
Я так понял, что для использования -> в привычном виде надо, чтобы то, что возвращает этот оператор также поддерживало обращение по ->. Иначе нужно вызывать через .operator и весь смысл перегрузки теряется. В этом случае лучше уж сделать какой-нибудь метод.
__________________
Единственный способ стать умнее - играть с более умным противником.

Последний раз редактировалось Sam Gold; 25.07.2019 в 21:07.
Sam Gold вне форума   Ответить с цитированием
Старый 30.07.2019, 09:22   #9
taras-proger77
Форумчанин
 
Регистрация: 17.12.2018
Сообщений: 419
Репутация: -121
По умолчанию

Цитата:
Сообщение от Sam Gold Посмотреть сообщение
Может, только смысла особого не имеет и его придется вызывать монструозной конструкцией
Зачем?

Последний раз редактировалось taras-proger77; 30.07.2019 в 09:26.
taras-proger77 вне форума   Ответить с цитированием
Старый 01.08.2019, 23:18   #10
Sam Gold
Участник клуба
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Адрес: Город Святого Петра
Сообщений: 538
Репутация: 263
По умолчанию

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
Зачем?
Иначе ошибка компиляции будет
__________________
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как из файла "Пример Меню" не очень подкованный пользователь сможет сделать файл устроенный так же как "Пример импорта" qaws Помощь студентам 2 10.09.2016 15:49
Расчет с оператором if Fahman Общие вопросы Delphi 10 06.11.2015 19: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 21:07


19:39.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.