P3t*_*rus 3 c++ boost boost-statechart statechart
我正在尝试学习boost :: statechart.
我想制作一个加载文件的小应用程序.
// --------------------------------
// | |
// | O Project |
// | | |
// | v |
// | ---------------------------- |
// | | | |
// | | Unloaded | |
// | ---------------------------- |
// | | ^ |
// | | EvLoad | EvUnload |<-----O
// | v | |
// | ---------------------------- |
// | | | |
// | | Loaded | |
// | ---------------------------- |
// | | ^ |
// | | | EvLoad |
// | ----- |
// --------------------------------
Run Code Online (Sandbox Code Playgroud)
但是我如何将参数传输到状态,例如文件名?如果我将文件名存储在EvLoad中,我可以轻松访问它以进行状态反应
struct Loaded : sc::simple_state< Loaded, Project>
{
typedef sc::custom_reaction< EvLoad > reactions;
sc::result react( const EvLoad & e )
{
//load file e.path()
...
return discard_event();
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我处于Unloaded状态时,我正在调用Loaded的构造函数,我无法将参数传递给它.我提出的唯一解决方法是在转换之前重新发布事件,但这看起来有点脏.
struct Unloaded : sc::simple_state< Unloaded, Project >
{
typedef sc::custom_reaction< EvLoad > reactions;
sc::result react( const EvLoad & e )
{
post_event( e ); //workaround to pass the event to the loaded state
return transit<Loaded>();
}
};
Run Code Online (Sandbox Code Playgroud)
还有更好的选择吗?
小智 9
我们使用triggering_event方法来拉取触发事件,然后将数据作为成员变量附加到触发事件.它节省了大量的编码工作,使我们不必生成自定义反应或将转换变量附加到状态图(我见过的两种常见方法).
| 归档时间: |
|
| 查看次数: |
2841 次 |
| 最近记录: |