Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
09.04.2014, 19:21     Перегрузка operator->() #1
Всем привет!

Прохожу тему дескрипторов и меня удивляет как работает перегруженный 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()?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2014, 19:21     Перегрузка operator->()
Посмотрите здесь:

C++ Перегрузка operator+
C++ перегрузка operator<<
Перегрузка operator= C++
C++ перегрузка operator[][][]
C++ Перегрузка operator new
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
09.04.2014, 19:47     Перегрузка operator->() #2
Цитата Сообщение от BESSON_off Посмотреть сообщение
не что-то подобное этому: h->->show()?
Именно подобное этому на самом деле и происходит (попробуй):
C++
1
2
3
4
void func(handle h)
{
    h.operator->()->show();
}
Цитата Сообщение от BESSON_off Посмотреть сообщение
Почему корректна такая конструкция
Это просто синтаксическое упрощение.
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
09.04.2014, 19:49  [ТС]     Перегрузка operator->() #3
Цитата Сообщение от DrOffset Посмотреть сообщение
Это просто синтаксическое упрощение.
Непонятно...
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
09.04.2014, 20:08     Перегрузка operator->() #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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->.
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
09.04.2014, 20:38  [ТС]     Перегрузка operator->() #5
Спасибо!
Yandex
Объявления
09.04.2014, 20:38     Перегрузка operator->()
Ответ Создать тему
Опции темы

Текущее время: 05:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru