Правила программирования на С и С++. Главы 7-8 - Перегрузив одну операцию, вы должны перегрузить все сходные с ней операции
ОГЛАВЛЕНИЕ
147. Перегрузив одну операцию, вы должны перегрузить все сходные с ней операции.
Это правило является продолжением предыдущего. После того, как вы сказали, что "итератор работает совсем подобно указателю", он на самом деле должен так работать. Пример в предыдущем правиле использовал лишь перегруженные * и ++, но моя настоящая реализация итератора делает аналогию полной, поддерживая все операции с указателями. Таблица 4 показывает различные возможности (t является деревом, а ti - итератором для дерева). Обе операции *++p и *p++ должны работать и т.д. В предыдущем примере я бы должен был также перегрузить в классе tree операции operator[] и (унарная)operator*() для того, чтобы аналогия дерева с массивом выдерживалась везде. Вы уловили эту мысль.
Таблица 4. Перегрузка операторов в итераторе.Операция | Описание |
ti = t; | Возврат к началу последовательности |
--ti; | Возврат к предыдущему элементу |
ti += i; | Переместить вперед на i элементов |
ti -= i; | Переместить назад на i элементов |
ti + i; ti - i; | Присваивает итератору другой временной переменной значение с указанным смещением от ti |
ti[i]; | Элемент со смещением i от текущей позиции |
ti[-i]; | Элемент со смещением -i от текущей позиции |
t2 = ti; | Скопировать позицию из одного итератора в другой |
t2 - ti; | Расстояние между двумя элементами, адресуемыми различными итераторами |
ti->msg(); | Послать сообщение этому элементу |
(*ti).msg(); | Послать сообщение этому элементу |
Одна из проблем здесь связана с операциями operator==() и operator!=(), которые при первом взгляде кажутся имеющими смысл в ситуациях, где другие операции сравнения бессмысленны. Например, вы можете использовать == для проверки двух окружностей на равенство, но означает ли равенство "одинаковые координаты и одинаковый радиус", или просто "одинаковый радиус"? Перегрузка других операций сравнения типа ? или ?= еще более сомнительна, потому что их значение не совсем очевидно. Лучше полностью избегать перегрузки операций, если есть какая-либо неясность в их значении.