Перегрузив одну операцию, вы должны перегрузить все сходные с ней операции
Это правило является продолжением предыдущего. После того, как вы сказали, что "итератор работает во всем подобно указателю", он на самом деле должен так работать. Пример в предыдущем правиле использовал лишь перегруженные * и ++, но моя настоящая реализация итератора делает аналогию полной, поддерживая все операции с указателями. Таблица 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!=(), которые при первом взгляде кажутся имеющими смысл в ситуациях, где другие операции сравнения бессмысленны. Например, вы можете использовать == для проверки двух окружностей на равенство, но означает ли равенство "одинаковые координаты и одинаковый радиус", или просто "одинаковый радиус"? Перегрузка других операций сравнения типа или = еще более сомнительна, потому что их значение не совсем очевидно. Лучше полностью избегать перегрузки операций, если есть какая-либо неясность в их значении.