Вызов Функции
Вызов функции, то есть запись выражение (список_выражений),
можно проинтерпретировать как бинарную операцию, и операцию вызова можно
перегружать так же, как и другие операции. Список параметров функции operator()
вычисляется и проверяется в соответствие с обычными правилами передачи
параметров. Перегружающая функция может оказаться полезной главным образом для
определения типов с единственной операцией и для типов, у которых одна операция
настолько преобладает, что другие в большинстве ситуаций можно не принимать во
внимание.
Для типа ассоциативного массива assoc мы не определили
итератор. Это можно сделать, определив класс assoc_iterator, работа которого
состоит в том, чтобы в определенном порядке поставлять элементы из assoc.
Итератору нужен доступ к данным, которые хранятся в assoc, поэтому он сделан
другом:
class assoc {
friend class assoc_iterator;
pair* vec;
int max;
int free;
public:
assoc(int);
int&
operator[](char*);
};
Итератор определяется как
class assoc_iterator{
assoc* cs; // текущий массив assoc
int i; // текущий индекс
public:
assoc_iterator(assoc& s) { cs = &s; i = 0; }
pair*
operator()()
{ return
(ifree)? &cs->vec[i++] : 0; }
};
Надо инициализировать assoc_iterator для массива assoc,
после чего он будет возвращать указатель на новую pair из этого массива всякий
раз, когда его будут активизировать операцией (). По достижении конца массива
он возвращает 0:
main() //
считает вхождения каждого слова во вводе
{
const MAX =
256; // больше самого большого слова
char buf[MAX];
assoc
vec(512);
while
(cin>>buf) vec[buf]++;
assoc_iterator
next(vec);
pair* p;
while ( p =
next() )
cout
name val
}
Итераторный тип вроде этого имеет преимущество перед
набором функций, которые выполняют ту же работу: у него есть собственные
закрытые данные для хранения хода итерации. К тому же обычно существенно, чтобы
одновременно могли работать много итераторов этого типа.
Конечно, такое применение объектов для представления
итераторов никак особенно с перегрузкой операций не связано. Многие любят
использовать итераторы с такими операциями, как first(), next() и last()
(первый, следующий и последний).
Список литературы
Для подготовки данной работы были использованы материалы
с сайта http://www.realcoding.net