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

Перегрузка операторов -> <- - C++

Восстановить пароль Регистрация
 
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
31.01.2013, 03:31     Перегрузка операторов -> <- #1
Здравствуйте в столь позднее время..
Какова особеность перегрузки операторов -> и . ?

Что возвращают ?
Если можно ссылки на стандарт...Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2013, 03:31     Перегрузка операторов -> <-
Посмотрите здесь:

C++ [c++] Перегрузка операторов
[C++] Перегрузка операторов C++
C++ Перегрузка операторов
перегрузка операторов C++
C++ перегрузка операторов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11835 / 6814 / 769
Регистрация: 27.09.2012
Сообщений: 16,890
Записей в блоге: 2
Завершенные тесты: 1
31.01.2013, 04:13     Перегрузка операторов -> <- #2
Цитата Сообщение от Dr.Urban Посмотреть сообщение
Если можно ссылки на стандарт.
[Note: because ., .*, and :: can-not be overloaded, these operators are always built-in operators interpreted according to clause 5. ?: can-not be overloaded, but the rules in this subclause are used to determine the conversions to be applied to the second and third operands when they have class or enumeration type
Перегрузка операторов -> <-

Class member access operator-> shall be a non-static member function taking no parameters. It implements class member access using ->
postfix-expression -> id-expression
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.
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
31.01.2013, 04:23  [ТС]     Перегрузка операторов -> <- #3
Что должен оператор -> возвращать?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11835 / 6814 / 769
Регистрация: 27.09.2012
Сообщений: 16,890
Записей в блоге: 2
Завершенные тесты: 1
31.01.2013, 04:52     Перегрузка операторов -> <- #4
просто для примера:
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
#include <iostream>
 
struct MyData{
    int x;
    int y;
};
 
class MyPointer{
    MyData * data;
public:
    MyPointer(MyData & x){data=&x;}
    MyData * operator->(){return data;}
    MyData & operator*(){return *data;}
};
 
int main(){
    MyData V={4,6};
    MyPointer px(V);
    std::cout<<"x = "<<V.x<<"\n"<<"y = "<<V.y<<"\n\n";
    (*px).x=45;
    (*px).y=12;
    std::cout<<"x = "<<V.x<<"\n"<<"y = "<<V.y<<"\n\n";
    px->x=10;
    px->y=25;
    std::cout<<"x = "<<V.x<<"\n"<<"y = "<<V.y<<"\n\n";
 
}
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
31.01.2013, 12:28  [ТС]     Перегрузка операторов -> <- #5
Спасибо, пример хороший. Но меня интересует каким образом оператор -> возвращая указатель, без других операторов работает с х, у. Логичней было бы * ( px.operator->() ) . x или px.operator->()->x, но достаточно одного ->. Как?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
31.01.2013, 13:02     Перегрузка операторов -> <- #6
Dr.Urban, у оператора -> особая семантика. При его вызове он применяется рекурсивно к результату предыдущего вызова до тех пор, пока не найдёт нужный член в очередном объекте-результате. Пример:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
 
struct Value
{
    int value;
};
 
class Foo
{
public:
    int foo;
    
    Foo(int foo):
        m_foo{foo}
    {
    }
    
    Value *operator->()
    {
        return &m_foo;
    }
    
private:
    Value m_foo;
};
 
class Bar
{
public:
    Bar(int bar):
        m_bar(bar)
    {
    }
    
    Foo operator->()
    {
        return m_bar;
    }
    
private:
    Foo m_bar;
};
 
class Moo
{
public:
    Moo(int moo):
        m_moo(moo)
    {
    }
    
    Bar operator->()
    {
        return m_moo;
    }
    
private:
    Bar m_moo;
};
 
int main()
{
    Moo moo(10);
    
    // Пройдём по всей цепочке Moo->Bar->Voo->Value, в котором найдём поле value
    std::cout << moo->value << std::endl;
    
    return 0;
}
http://liveworkspace.org/code/DbtMi$7
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
31.01.2013, 13:12  [ТС]     Перегрузка операторов -> <- #7
Идея мне нравиться и пример работает, но остался 1 вопрос.
Почему сигнатуры операторов разные?

Value *operator->() // возврат указателя
Foo operator->() // возврат по значению
Bar operator->() // возврат по значению

Выглядит как магия =)
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
31.01.2013, 13:18     Перегрузка операторов -> <- #8
Dr.Urban, смотрите. В Bar перегружен оператор ->. Значит оператор -> в Moo должен возвратить Bar (чтобы компилятор подставил рекурсивный вызов оператора -> для Bar). Так же и для Bar, в нём перегружен оператор ->, возвращающий Foo, чтобы компилятор мог применить -> к объекту типа Foo. Однако когда-то же компилятор должен остановиться? Вот таким базисом и служит оператор -> в Foo, возвращающий указатель на объект типа Value. Как только мы получили указатель - компилятор применяет стандартный оператор ->, т.е. обращается именно к члену объекта типа Value, а не рекурсивно применяет определённый пользователем оператор, и наконец доходит до реального поля value, значение которого и будет результатом применения оператора -> к объекту типа Moo.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2013, 13:29     Перегрузка операторов -> <-
Еще ссылки по теме:

Перегрузка операторов C++
Перегрузка операторов C++
C++ Перегрузка операторов (--, +=, -=, == )

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

Или воспользуйтесь поиском по форуму:
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
31.01.2013, 13:29  [ТС]     Перегрузка операторов -> <- #9
Ай красавчик! Все ясно теперь.
Yandex
Объявления
31.01.2013, 13:29     Перегрузка операторов -> <-
Ответ Создать тему
Опции темы

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