Реферат: Эффективное использование STL и шаблонов
(STransitionsProxy(letter) << “identifier” << “unknown” << “identifier” << “unknown”) <<
(STransitionsProxy(digit) << “number” << “number” << “identifier” << “unknown”)
)
);
На конструктор SFiniteStateMachine будет возложена задача проверки начального состояния. Оно должно быть в списке состояний.
Путем форматирования текста уже удалось придать аргументам конструктора вид таблицы. Однако это еще не все. При описании автомата были опущены все детали, связанные с шаблонами. На практике это означает, что при конструировании также придется указывать типы, что дополнительно “замусорит” текст. Несмотря на проблемы, связанные с препроцессором, он здесь поможет. Запись аргументов конструктора станет примерно такой:
FSMBEGIN( “empty” ) FSMSTATES “empty” << “number” << “identifier” << “unknown” FSMEVENT(letter) “identifier” << “unknown” << “identifier” << “unknown” FSMEVENT(digit) “number” << “number” << “identifier” << “unknown” FSMEND |
Такая запись уже приемлема для повседневного использования.
Детали реализации
Реализация должна включать ряд вспомогательных элементов, в частности, исключения. Автомат будет выдавать их в случае ошибки в описании состояний и переходов. При разработке своего класса исключений можно воспользоваться наследованием от класса стандартного исключения. Это даст возможность указать в блоке catch только ссылку на базовый стандартный класс исключений. Свой класс исключений можно определить так:
class SStateMachineException : public std::exception { private: const std::string Message; public: SStateMachineException( const std::string & Msg ) : Message( Msg ) {} SStateMachineException( const char * Msg ) : Message( Msg ) {} virtual ~SStateMachineException() throw() {} virtual const char * what( void ) const throw() { return Message.c_str(); } private: SStateMachineException(); }; |
В основной программе, использующей класс автомата, можно будет написать так:
. . . try { К-во Просмотров: 416
Бесплатно скачать Реферат: Эффективное использование STL и шаблонов
|