Реферат: Эффективное использование STL и шаблонов
“empty”, “number”, “identifier”, “unknown”,
letter, “identifier”, “unknown”, “identifier”, “unknown”,
digit, “number”, “number”, “identifier”, “unknown”
);
Со стартовым состоянием все просто: это всего лишь объект класса, представляющего состояние. Со списком состояний и тем более со списком переходов дело сложнее. Перечислить состояния через запятую не удастся. Более того, для SFiniteStateMachine было бы удобно иметь фиксированное количество аргументов. Оказывается, это возможно. Ведь мы можем создать временные объекты, каждый из которых будет заниматься своим списком.
SFiniteStateMachine( const SState & StartState, SStatesListProxy( <списоксостояний> ), STransitionsProxy( <список переходов для события 1> ), STransitionsProxy( <список переходов для события 2> ), . . . ); |
Рассмотрим список состояний. Здесь остается та же проблема – неопределенное количество состояний. Помочь в ее решении может перегрузка операторов и конструктор по умолчанию. Перечислить аргументы через запятую все равно не удалось бы, но вместо запятой подошел бы и другой разделитель. Таким разделителем может быть <<, то есть обработку списка состояний можно записать так:
SStatesListProxy() << “empty” << “number” << “identifier” << “unknown” |
Перегруженный operator<< для SStatesListProxy проверит, что среди состояний нет повторяющихся, а кроме того обеспечит типобезопасность для состояний. Переменное количество состояний при такой записи тоже не проблема. Конструктор для SFiniteStateMachine теперь можно записать так:
SFiniteStateMachine( const SState & StartState, (SStatesListProxy() << “empty” << “number” << “identifier” << “unknown”), STransitionsProxy( <список переходов для события 1> ) STransitionsProxy( <список переходов для события 2> ), . . . ); |
Аналогичным образом поступим со списком переходов для одного события. Отличие будет лишь в том, что каждый список переходов имеет еще один атрибут – событие, для которого описываются переходы. Конструктор STransitionsProxy будет принимать один аргумент: событие, а перегруженный operator<< будет принимать состояния.
STransitionsProxy( letter ) << “identifier” << “unknown” << “identifier” << “unknown” |
Вернемся к конструктору автомата. У него тоже есть список переменной длины – строки таблицы описания переходов или STransitionsProxy. Решим эту задачу уже известным способом: создание временного объекта и перегрузка operator<< для SStatesListProxy и STransitionsProxy.
SStatesMachineProxy() << SStatesListProxy << STransitionsProxy |
Перегруженный operator<< проверит, что сначала идет список состояний, что список состояний только один, что в списках переходов нет повторяющихся событий и в переходах указаны только состояния, указанные в списке состояний. operator<< также проверит, что количество состояний в списках переходов равно количеству состояний в списке состояний. В результате конструктор SFiniteStateMachine будет выглядеть так:
SFiniteStateMachine( const StateType & StartState, const SFiniteStateMachineProxy & ProxyMachine ); |
Теперь очередь за реализацией описанных выше идей. Запишем конструктор автомата для рассматриваемого примера полностью.
SFiniteStateMachine FirstMachine( “empty”, (SFiniteStateMachineProxy() << К-во Просмотров: 415
Бесплатно скачать Реферат: Эффективное использование STL и шаблонов
|