0 / 0 / 0
Регистрация: 26.09.2018
Сообщений: 9
1

перегрузка оператора ->

14.05.2022, 21:13. Показов 819. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
#include <iostream>
 
template<class T>
class Auto_ptr1
{
    T* m_ptr;
public:
 
    Auto_ptr1(T* ptr = nullptr)
        :m_ptr(ptr)
    {
    }
 
    
    ~Auto_ptr1()
    {
        delete m_ptr;
    }
 
    T& operator*() const { return *m_ptr; }
    T* operator->() const { return m_ptr; }
};
 
 
class Item
{
public:
    Item() { std::cout << "Item acquired\n"; }
    ~Item() { std::cout << "Item destroyed\n"; }
 
    int val = 90;
};
 
int main()
{
    Auto_ptr1<Item> item(new Item); // динамическое выделение памяти
 
    std::cout << item->val;
 
    return 0;
}
Не понимаю, почему в этом примере не приходиться разыменовывать указатель ,возвращенный перегруженным оператором ->,
ведь в случае с оператором * там возвращается ссылка на обьект (который получается через разыменовывание указателя),
а в случае с -> этот шаг пропускается
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2022, 21:13
Ответы с готовыми решениями:

Перегрузка оператора []
Здравствуйте. Пробую перегрузить оператор . template &lt;class Element&gt; class List { public:...

Перегрузка оператора []
При перегрузке оператора возникли проблемы, подскажыте как правильно перегрузить этот оператор,...

Перегрузка оператора ~
Как перегрузить оператор ~? Пишет, что слишком много параметров для этой функции оператора

Перегрузка оператора []
Есть: class any{ char arr }

Перегрузка оператора ++
выводит не то значение привет. нужна Ваша подсказка. листинг из учебника: (тема: перегрузка...

6
"C with Classes"
1645 / 1402 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
14.05.2022, 21:20 2
Цитата Сообщение от den45 Посмотреть сообщение
а в случае с -> этот шаг пропускается
в стандарте так сказано
0
Вездепух
Эксперт CЭксперт С++
11688 / 6367 / 1723
Регистрация: 18.10.2014
Сообщений: 16,050
14.05.2022, 21:37 3
Лучший ответ Сообщение было отмечено Croessmah как решение

Решение

Цитата Сообщение от den45 Посмотреть сообщение
Не понимаю, почему в этом примере не приходиться разыменовывать указатель ,возвращенный перегруженным оператором ->
Потому что, согласно правилам языка, к результату пользовательского -> компилятором еще раз автоматически применяется оператор ->.

То есть запись item->val по определению означает item.operator ->()->val. Все тут в порядке, ничего не нужно дополнительно разыменовывать.
1
"C with Classes"
1645 / 1402 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
14.05.2022, 22:13 4
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Потому что, согласно правилам языка
в каком разделе стандарта это сказано, я не нашел.

Добавлено через 1 минуту
нашел только это http://eel.is/c++draft/over.ref

Добавлено через 30 минут
нашел вроде:
http://eel.is/c++draft/over.ma... otnote-113
1
0 / 0 / 0
Регистрация: 26.09.2018
Сообщений: 9
14.05.2022, 22:14  [ТС] 5
Вы ведь сами сказали, что так в стандарте сказано?
0
"C with Classes"
1645 / 1402 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
15.05.2022, 12:02 6
TheCalligrapher,den45, значит по сути в этом выражении item->val, -> на самом деле относится к самому последнему в цепочке скрытых вызовов перегруженных operator -> (если такие имеются).

Добавлено через 18 минут

If a user-defined operator-> is provided, the operator-> is called again on the value that it returns, recursively, until an operator-> is reached that returns a plain pointer. After that, built-in semantics are applied to that pointer.
0
Вездепух
Эксперт CЭксперт С++
11688 / 6367 / 1723
Регистрация: 18.10.2014
Сообщений: 16,050
15.05.2022, 18:24 7
Цитата Сообщение от _stanislav Посмотреть сообщение
TheCalligrapher,den45, значит по сути в этом выражении item->val, -> на самом деле относится к самому последнему в цепочке скрытых вызовов перегруженных operator -> (если такие имеются).
Не совсем понимаю, что имеется в виду. А что, промежуточные -> разве не являются ->?

Применение перегруженного пользовательского -> разворачивается в цепочку вызовов operator ->() до тех пор, пока мы не наткнемся на встроенный ->, то есть до тех пор, пока кто-то в этой цепочке не вернет голый указатель. Вот этот встроенный -> и сработает как ->val.
1
15.05.2022, 18:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2022, 18:24
Помогаю со студенческими работами здесь

Перегрузка оператора
Имеется время, например 12:12:12 Перегрузка инкремента Time &amp;Time::operator ++ () { ...

Перегрузка оператора ++
Написал префиксную перегрузку ++ Vremya &amp;Vremya::operator ++ () { int sec =...

Перегрузка оператора +
не получается в своем классе перегрузить оператор + :( пишет &quot;error C2804: бинарный &quot;operator +&quot;...

Перегрузка оператора +=
Собственно есть класс описывающий правильную дробь с целой частью, числителем и знаменателем, нужно...

Перегрузка оператора []
Есть код перегрузки оператора для получения данных из массива. #include &lt;iostream&gt; class...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru