Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

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

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

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

Код:
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, 19:29   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

smart pointers
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.07.2019, 22:27   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

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

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

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

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

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

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

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

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

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

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

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

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как из файла "Пример Меню" не очень подкованный пользователь сможет сделать файл устроенный так же как "Пример импорта" 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