Стратегию по умолчанию (не вызывать никакую функцию)
можно передать в качестве аргумента шаблона. Стратегия вызова функций, скорее
всего, будет меняться чаще, чем стратегия действий при неизвестном событии.
Поэтому ее имеет смысл поместить в списке аргументов перед стратегией реакции
на неизвестное событие:
template <class SState, class SEvent,
class SFunctor =
SEmptyFunctor<SState,SEvent>,
class
SUnknownEventStrategy = SThrowStrategy<SEvent> >
class SFiniteStateMachine { . . . };
|
Еще один вопрос, связанный с событиями, состоит в том, что событие может быть сгенерировано внутри функции, вызываемой при выходе или
входе в состояние. Для обработки таких событий надо соответствующим образом
спроектировать функцию, принимающую событие. С учетом таких “внутренних”
событий, надо предусмотреть очередь, в которую будут помещаться события. Код, который обрабатывает переходы, должен будет делать это до тех пор, пока очередь
не опустеет. В качестве контейнера, подходящего для хранения событий, воспользуемся deque из STL. Поскольку нам нужны только вставка элементов в
начало и исключение из конца контейнера, без произвольного доступа, контейнер
deque подойдет лучше всего.
Осталось совсем немного. Иногда нужно привести автомат
в исходное состояние. Как и в случае с событиями предусмотрим два варианта:
обычная функция и перегруженный operator <<. Для перегруженного operator
<< нужно определить специальный манипулятор:
enum SMachineManipulator
{
ResetMachine = 0
};
. . .
inline SFiniteStateMachine & operator << (
SMachineManipulator Manipulator )
{
if ( Manipulator == ResetMachine
)
return Reset();
return *this; Рекомендуем скачать другие рефераты по теме: налоги и налогообложение, конспект по русскому.
Предыдущая страница реферата | 3
4
5
6
7
8
9
10
11
12
13 | Следующая страница реферата
|
|