Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
 Аватар для BESSON_off
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351

Перегрузка operator->()

09.04.2014, 19:21. Показов 1274. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Прохожу тему дескрипторов и меня удивляет как работает перегруженный operator->().

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
//какой то интерфейс
struct Abstr {
virtual void show() {}
virtual ~Abstr() {}
};
 
//какой то класс наследует интерфейс
struct One : public Abstr { 
void show () {cerr << “One\n”;}
};
 
//создаем хендл на абстракцию
struct handle {
Abstr* ptr;
Abstr* operator-> () {return ptr;}
handle (Abstr* pp): ptr(pp) {}
};
 
void func(handle h) {
h->show();
}
 
int main()
{
One test;
func(&test);
return 0;
}
В конечной функции func объект хендла, через перегруженный operator-> возвращает объект Abstr, который в дальнейшем вызывает функцию show(). Но если мы разложим операции в функции func, то получиться, что “h->” возвращает “ptr”, после чего мы получаем ptrshow(), а не ptr->show(). Почему корректна такая конструкция, а не что-то подобное этому: h->->show()?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.04.2014, 19:21
Ответы с готовыми решениями:

Перегрузка operator>> и operator<< в абстрактном классе
Здрасьте! Есть необходимость перегрузить потоки, Я знаю как это сделать через friend, но вот кажется что есть и другое решение. Попытался...

Перегрузка operator<<
Доброе время суток. Есть очередная задачка - перегрузить оператор вывода таким образом: Есть три объекта разных классов - А а, В...

Перегрузка operator+
Нужно сложить число с каждым елементом вектора, вот мой код: MyVectorClass.h namespace program { class MyVectorClass { ...

4
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
09.04.2014, 19:47
Цитата Сообщение от BESSON_off Посмотреть сообщение
не что-то подобное этому: h->->show()?
Именно подобное этому на самом деле и происходит (попробуй):
C++
1
2
3
4
void func(handle h)
{
    h.operator->()->show();
}
Цитата Сообщение от BESSON_off Посмотреть сообщение
Почему корректна такая конструкция
Это просто синтаксическое упрощение.
0
 Аватар для BESSON_off
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
09.04.2014, 19:49  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Это просто синтаксическое упрощение.
Непонятно...
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
09.04.2014, 20:08
Лучший ответ Сообщение было отмечено BESSON_off как решение

Решение

Цитата Сообщение от BESSON_off Посмотреть сообщение
Непонятно...
Ну правила такие в языке. Вот из стандарта С++:
13.3.1.2/8
The second operand of operator -> is ignored in selecting an operator-> function, and is not an argument
when the operator-> function is called. When operator-> returns, the operator -> is applied to the value
returned, with the original second operand.
130
И сноска:
130) If the value returned by the operator-> function has class type, this may result in selecting and calling another operator-> function. The process repeats until an operator-> function returns a value of non-class type.
И вот 13.5.6/1
operator-> shall be a non-static member function taking no parameters. It implements the class member
access syntax that uses ->.
postfix-expression -> templateopt id-expression
postfix-expression -> pseudo-destructor-name

An expression x->m is interpreted as (x.operator->())->m for a class object x of type T if T::operator->()
exists and if the operator is selected as the best match function by the overload resolution mechanism (13.3).
То есть operator-> по правилам языка должен возвращать нечто, к чему применима операция ->. Это либо указатель, либо другой класс с переопределенным operator->.
0
 Аватар для BESSON_off
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
09.04.2014, 20:38  [ТС]
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.04.2014, 20:38
Помогаю со студенческими работами здесь

Перегрузка operator-> ()
здравствуйте, объясните пож. как работает operator-&gt; (). Что происходит при этом мне понятно, но непонятно как. template &lt;typename...

Перегрузка operator+
Как сложить суму годовы продаж всех компаний? Можно использовать перегрузку оператора +? #include &lt;iostream.h&gt; #include...

Перегрузка operator new
Столькнулся с такой проблемой: Есть класс Array, в его конструкторе создается массив int Array::Array(const size_t...

перегрузка operator<<
помогите отгадать в чет ошибка class MCL{ private: int x,y; public: friend ostream&amp; operator&lt;&lt;(ostream &amp;s, MCL &amp;c); ...

Перегрузка operator[]
Забыл как перегружать оператор для присваивания значений, а найти не могу ._. Чтобы было вот так: Class A { private: char...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru