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