Chapter 5. Questions & Answers, tips
Где я должен определить государственную машину?Учебники реализованы в простом файле cpp для простоты. Я хочу моделировать динамическое поведение класса как машины состояния, как я должен определять машину состояния?
Ответить: Обычно вы хотите реализовать государственную машину как атрибут класса. К сожалению, конкретная государственная машина представляет собой типдеф, который не может быть объявлен вперед. Это оставляет вам две возможности:
Обеспечить определение машины состояния внутри класса заголовка и содержать экземпляр в качестве атрибута. Простой, но с несколькими недостатками: использование директив пространства имен не рекомендуется, а стоимость компиляции времени для всех модулей, включая заголовок.
Сохраняйте указатель состояния в виде (общего) указателя внутриопределения классаи реализуйте машину состояния в файлеcpp.. Минимальное время компиляции, с использованием директив в порядке, но государственная машина теперь находится внутри кучи.
Вопрос: on_entry получает в качестве аргумента отправленное событие. Какое событие происходит, когда состояние активируется по умолчанию (потому что это начальное состояние)?
Ответ: Чтобы вы знали, что государство активировано по умолчанию, MSM генерирует импульс::msm::Init Событие по умолчанию.
Вопрос: Почему я не вижу призыва к переходу в моей подмашине?
Ответ: Правило приоритета, установленное UML. В ней говорится, что в случае переходного конфликта наиболее внутреннее состояние имеет более высокий приоритет. Таким образом, после запроса внутреннего состояния, содержащее соединение должно быть также предложено обработать переход и найти возможный переход.
Вопрос: Почему я получаю ошибку компиляции, говорящую, что компилятор не может преобразовать в функцию ...Fsm::*(some_event)?
Ответ: Вы, вероятно, определили переход, вызванный событием some_event, но использовали метод защиты/действия, принимая другое событие.
Вопрос: Почему я получаю ошибку компиляции, говоря что-то вроде & #8220; слишком мало & #8221; или & #8220; слишком много & #8221; аргументы шаблона?
Ответ: Вы, вероятно, определили переход в виде a_row или g_row, где вы хотели просто _row или наоборот. С Роу это может означать, что вы забыли "ни одного".
Вопрос: Почему я получаю очень длинную ошибку компиляции, когда определяю более 20 строк в таблице переходов?
Ответ: MSM использует Boost. MPL под капотом и это максимальный размер по умолчанию. Пожалуйста, определите следующие 3 макроса, прежде чем включать любые заголовки MSM:
#define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
#define BOOST_MPL_LIMIT_VECTOR_SIZE 30 // or whatever you need
#define BOOST_MPL_LIMIT_MAP_SIZE 30 // or whatever you need
Вопрос: Почему я получаю эту ошибку: & #8221; ошибка C2977: 'boost::mpl::vector': слишком много шаблонных аргументов”?
Ответ: Первая возможность заключается в том, что вы определили таблицу перехода как, скажем, вектор17 и имеете 18 записей. Во-вторых, у вас есть 17 записей и составное состояние. Под капотом MSM добавляет строку для каждого события в составной таблице переходов. Третий заключается в том, что вы использовали mpl::vector без количества записей, но близки к MPL по умолчанию 50 и имеют композит, тем самым толкая вас выше 50. Тогда вам нужен mpl/vector60/70….hpp и mpl/map60/70….hpp
Вопрос: Почему я получаю очень длинную ошибку компиляции, когда определяю более 10 состояний в машине состояний?
Ответ: MSM использует Boost. Слияние под капотом и это максимальный размер по умолчанию. Пожалуйста, определите следующий макрос перед включением любых заголовков MSM:
#define FUSION_MAX_VECTOR_SIZE 20 // or whatever you need