Правила программирования на Си и Си++

       

Перегрузив одну операцию, вы должны перегрузить все сходные с ней операции


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



Содержание раздела