Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 351
#1

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

09.04.2014, 19:21. Просмотров 238. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2014, 19:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка operator->() (C++):

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

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

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

Перегрузка operator[]= - C++
Привет народ, вопрос такой - что и как нужно перегрузить в классе, чтобы работал синтаксис вида class ADE {..}; ADE a; ... a |=...

Перегрузка operator[][][] - C++
Здорова господа!!! Как перегрузить operator для класса или operator ??? Что нужно из него возвращать? От что то пытался но не...

Перегрузка operator+ - C++
при сложени myVector2 = myVector0 + myVector1; выодит сообщения &quot;конструктоор 0&quot; ...1,...2,....2(копирования) а потом деструктор 2,2,1,2...

4
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
09.04.2014, 19:47 #2
Цитата Сообщение от BESSON_off Посмотреть сообщение
не что-то подобное этому: h->->show()?
Именно подобное этому на самом деле и происходит (попробуй):
C++
1
2
3
4
void func(handle h)
{
    h.operator->()->show();
}
Цитата Сообщение от BESSON_off Посмотреть сообщение
Почему корректна такая конструкция
Это просто синтаксическое упрощение.
0
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 351
09.04.2014, 19:49  [ТС] #3
Цитата Сообщение от DrOffset Посмотреть сообщение
Это просто синтаксическое упрощение.
Непонятно...
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
09.04.2014, 20:08 #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->.
0
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 351
09.04.2014, 20:38  [ТС] #5
Спасибо!
0
09.04.2014, 20:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2014, 20:38
Привет! Вот еще темы с ответами:

Перегрузка operator= - C++
Возможно ли перегрузить оператор= так, что бы можно было написать? val = {10, 20, 15};

Перегрузка operator<() - C++
#include &lt;QCoreApplication&gt; #include &lt;QDebug&gt; #include &lt;QVector&gt; class My { public: int a; void operator=(const...

Перегрузка operator= - C++
const Point&amp; operator= (const Point &amp;p) { if (this ==&amp;p) return *this; x = p.x; y = p.y; color = p.color; ...

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru