#c #operator-overloading
#c #оператор-перегрузка
Вопрос:
У меня есть класс интеллектуального указателя, и я хочу его перегрузить operator->
; это предусмотрено для удобства, чтобы я мог напрямую обращаться к членам класса, содержащимся внутри интеллектуального указателя.
Я смотрел на то, как Boost реализует этот оператор в своем shared_ptr
шаблоне. Я заметил, что они добавили проверку утверждения, действительно ли указатель не равен нулю, прежде чем возвращать его. В настоящее время мой оператор возвращает указатель, не проверяя, равен ли он нулю (по сути, нулевой указатель — это неопределенное поведение в моей текущей реализации). Должен ли я также добавить это утверждение?
(Кроме того, как вызывается этот оператор? Я не смог найти это в Интернете.)
Комментарии:
1. Называть свой собственный класс «умным» чем угодно — это путь к катастрофе.
2. Вы хотите неопределенное поведение или нет? Это на 100% ваш выбор в реализации. Я не думаю, что кто-нибудь здесь может сказать вам, следует или не следует добавлять такую функцию.
3. @Tomalak Вот как они называются — интеллектуальные указатели. Я не придумывал название. 😉
4. Я знаю, что это то, как они называются (некоторыми людьми). Это все еще путь к катастрофе.
5. @Tomakal Предполагаю, что ты не шутишь… Как имя может привести к катастрофе? Является ли Boost также катастрофой (см.
boost/smart_ptr/
)?
Ответ №1:
Это зависит от вас. Вы могли бы просто задокументировать, что его использование с нулевым указателем не определено, и ничего не делать, вы могли бы утверждать, вы могли бы выдать исключение. Правильного ответа не существует. Лично я бы, вероятно, выдал исключение.
Комментарии:
1. Хорошо, спасибо! Я пошел с утверждением: если я в конечном итоге попытаюсь вызвать функцию через нулевой указатель, это будет моя ошибка как программиста. (По крайней мере, в моем приложении, потому что пользователь не может ввести данные, которые вызывали бы
operator->
значение null .)
Ответ №2:
Должен ли я также добавить это утверждение?
Если вы счастливы без этого, тогда все в порядке. Просто убедитесь, что это задокументировано: это важная вещь.
(Кроме того, как вызывается этот оператор? Я не смог найти это в Интернете.)
На самом деле у него нет названия. Стандарт просто называет его « ->
operator», также ссылаясь на него как на «один из операторов доступа к члену класса» ( [expr.const]
).
В Википедии он указан как «элемент b объекта, на который указывает a» (где, да, другим операторам присваиваются краткие идентификаторы).
Комментарии:
1. Обычно я просто называю это » другим оператором разыменования». 😛
2. Я называю это оператором «стрелка».