Диаграмма состояния Boost `State context` равна нулю - PullRequest
0 голосов
/ 21 октября 2019

У меня есть маленький sm с одним state на данный момент. Я хочу из state получить доступ к некоторому data, который получен и сохранен sm на конструкции:

struct data {
    std::string m_ip;
    data(const char* ip)
        : m_ip(ip)
    {
    }
};

namespace sc = boost::statechart;

struct s1;
struct sm : sc::state_machine<sm, s1> {
    data* m_data;
    sm(data* d)
        : m_data { d }
    {
    }
};

struct s1 : sc::simple_state<s1, sm> {
    s1()
    {
        std::cout << context<sm>().m_data->m_ip; // assertion
    }
};

int main()
{
    data _data("192.168.1.1");
    sm _sm(&_data);
    _sm.initiate();

    return 0;
}

Когда я запускаю это, я получаю следующую ошибку:

test: /usr/include/boost/statechart/simple_state.hpp:682: static OtherContext& boost::statechart::simple_state<MostDerived, Context, InnerInitial, historyMode>::context_impl_other_context::context_impl(State&) [with OtherContext = sm; State = boost::statechart::simple_state<s1, sm>; MostDerived = s1; Context = sm; InnerInitial = boost::mpl::list<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>; boost::statechart::history_mode historyMode = (boost::statechart::history_mode)0]: Assertion `get_pointer( stt.pContext_ ) != 0' failed.

Я не понимаю, почему указатель контекста null.

1 Ответ

0 голосов
/ 21 октября 2019

Я нашел свой ответ здесь . Из комментария над утверждением меня пялилось в лицо:

// This assert fails when an attempt is made to access an outer 
// context from a constructor of a state that is *not* a subtype of
// state<>. To correct this, derive from state<> instead of
// simple_state<>.

Не уверен, следует ли пометить это как дубликат, поскольку это та же проблема, но вызванная немного по-другому (contextouter state, а не state machine, как в моем случае).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...