I have a state A
that I would like to transition to its next state B
unconditionally, once the constructor of A
has completed. Is this possible?
I tried posting an event from the constructor, which does not work, even though it compiles. Thanks.
Edit: Here is what I've tried so far:
struct A : sc::simple_state< A, Active >
{
public:
typedef sc::custom_reaction< EventDoneA > reactions;
A()
{
std::cout << "Inside of A()" << std::endl;
post_event( EventDoneA() );
}
sc::result react( const EventDoneA & )
{
return transit< B >();
}
};
This yields the following runtime assertion failure:
Assertion failed: get_pointer( pContext_ ) != 0, file /includ
e/boost/statechart/simple_state.hpp, line 459
The Boost Statechart library is a framework that allows you to quickly transform a UML statechart into executable C++ code, without needing to use a code generator. Thanks to support for almost all UML features the transformation is straight-forward and the resulting C++ code is a nearly redundancy-free textual description of the statechart.
States in the statechart may be hierarchical, i.e. contain other states and transitions. Statechart is used to show the state space of a given algorithm, the events that cause a transition from one state to another, and the actions that result from state change.
Statechart has states and transitions. Transitions may be triggered by user-defined conditions (timeouts or rates, messages received by the statechart, and Boolean conditions). Transition execution may lead to a state change where a new set of transitions becomes active.
The problem is that you cannot inherit from simple_state to achieve the desired transition, you must inherit from state, which then requires that you modify the constructor accordingly.
I've updated my OP with my solution, here it is so I can close the question.
The problem is that you cannot inherit from simple_state
to achieve the desired transition, you must inherit from state
, which then requires that you modify the constructor accordingly.
struct A : sc::state< A, Active >
{
public:
typedef sc::custom_reaction< EventDoneA > reactions;
A( my_context ctx ) : my_base( ctx )
{
std::cout << "Inside of A()" << std::endl;
post_event( EventDoneA() );
}
sc::result react( const EventDoneA & )
{
return transit< B >();
}
};
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With