Оператор перегрузки-> в C

#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. Я называю это оператором «стрелка».