Какая польза от перегрузки оператора доступа члена?

Возможный дубликат:
Перегрузка оператора

Оператор доступа к элементу -> может быть перегружен для возврата указателя на элемент данных или какую-либо другую переменную.

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

0

Решение

Оператор доступа к члену является несколько странным существом: он предназначен для возврата указателя или класса с перегруженным оператором доступа к члену. Как только он достигает указателя, он просто обращается к соответствующему члену. Основным использованием перегрузки оператора доступа к элементу являются интеллектуальные указатели, например, std::shared_ptr<T> а также std::unique_ptr<T>, Без этого оператора вам нужно было бы использовать что-то вроде

sp.get()->member

или же

(*sp).member

вместо

sp->member
3

Другие решения

Обратите внимание, что оба термина «переопределение» и «перегрузка» сильно вводят в заблуждение. Канонический -> оператор обращается к члену объекта, на который ссылается через указатель, то есть X* x; x->foo; получает доступ к чему-то указал на от x который имеет тип указателя (или, если быть более точным, необработанный указатель).

Тем не менее operator-> то, что вы можете реализовать как нестатическую функцию-член в агрегатных типах (то есть «классы»), делает что-то другое. В X* x; x->foo;, -> было бы еще быть оператором канонической структуры, которая не могу быть изменен. Однако в Y y; y->foo, -> будет ссылаться на operator-> функция-член Y, Это, казалось бы, небольшое различие имеет решающее значение, так как один оператор может только быть применены к необработанным типам указателей, а другие могут только быть применены к не указательным типам.

Это обычно используется, чтобы позволить типам вести себя синтаксически как будто они были необработанными указателями (с некоторыми семантическими различиями), как в shared_ptr и другие. Этого нельзя достичь без такой языковой поддержки, как shared_ptr<X> а также X* не может быть использован таким же образом, если не было shared_ptr<X>::operator-> позволяя имитировать каноническое -> оператор, который применим к X* (но нет X).

1

Когда вы моделируете указатель, и вы хотите сохранить обычный синтаксис для удобства. Просто взгляните на std :: unique_ptr и std :: shared_ptr. 🙂

0
По вопросам рекламы [email protected]