Выбор элемента с перегруженным оператором разыменования - PullRequest
3 голосов
/ 26 января 2012

При перегрузке оператора разыменования (operator*), оператор выбора элемента (operator->) использует перегруженный оператор или его тоже нужно перегрузить?

Ответы [ 3 ]

4 голосов
/ 26 января 2012

Вам нужно будет перегрузить оператор стрелки отдельно. В более общем смысле, даже если в C ++ есть хорошее сопоставление между связанными операторами, если вы перегрузите один оператор, вы не получите перегруженные остальные «бесплатно» и должны реализовать их самостоятельно.

Тем не менее, стрелку легко реализовать с помощью разыменования:

T* Class::operator -> () const {
    return &**this;
}

Это работает путем разыменования this, чтобы получить ссылку на объект-получатель, затем разыменования его, чтобы вызвать operator *, затем взятия адреса возвращенной ссылки, чтобы получить указатель на объект, к которому должна применяться стрелка.

Возможно, вы захотите заглянуть в библиотеку Boost.Operators , которая позволяет автоматически определять множество логически связанных операторов из небольшого набора базовых операций.

Надеюсь, это поможет!

0 голосов
/ 26 января 2012

5.2.5 «Если E1 имеет тип« указатель на класс X », тогда выражение E1->E2 преобразуется в эквивалентную форму (*(E1)).E2».Проблема в том, что в вашем случае E1 - это , а не указатель.

0 голосов
/ 26 января 2012

вы можете по существу реализовать перегруженный оператор разыменования, но затем вам придется дважды отложить его, чтобы ваш перегруженный оператор вступил в игру!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...