std::shared_ptr<FiniteStateMachine> WidgetScheduleNodeImpl::MakeFiniteStateMachine() { auto builder = FiniteStateMachine::Builder::New(GetDescription(), S_WIDGET_INIT); if (builder == nullptr) { return nullptr; } builder->MakeTransition(S_WIDGET_INIT, E_START_WIDGET, S_WIDGET_WAITING, [this](FiniteStateMachine &machine, uint32_t event) { OnStartSchedule(machine, event); }); builder->MakeTransition(S_WIDGET_WAITING, E_START_AUTH, S_WIDGET_AUTH_RUNNING, [this](FiniteStateMachine &machine, uint32_t event) { OnStartAuth(machine, event); }); builder->MakeTransition(S_WIDGET_WAITING, E_CANCEL_AUTH, S_WIDGET_AUTH_FINISHED, [this](FiniteStateMachine &machine, uint32_t event) { OnStopSchedule(machine, event); }); builder->MakeTransition(S_WIDGET_WAITING, E_NAVI_PIN_AUTH, S_WIDGET_AUTH_FINISHED, [this](FiniteStateMachine &machine, uint32_t event) { OnNaviPinAuth(machine, event); }); builder->MakeTransition(S_WIDGET_AUTH_RUNNING, E_COMPLETE_AUTH, S_WIDGET_AUTH_FINISHED, [this](FiniteStateMachine &machine, uint32_t event) { OnSuccessAuth(machine, event); }); builder->MakeTransition(S_WIDGET_AUTH_RUNNING, E_CANCEL_AUTH, S_WIDGET_AUTH_FINISHED, [this](FiniteStateMachine &machine, uint32_t event) { OnStopSchedule(machine, event); }); builder->MakeTransition(S_WIDGET_AUTH_RUNNING, E_NAVI_PIN_AUTH, S_WIDGET_AUTH_FINISHED, [this](FiniteStateMachine &machine, uint32_t event) { OnNaviPinAuth(machine, event); }); builder->MakeTransition(S_WIDGET_AUTH_RUNNING, E_START_AUTH, S_WIDGET_AUTH_RUNNING, [this](FiniteStateMachine &machine, uint32_t event) { OnStartAuth(machine, event); }); builder->MakeTransition(S_WIDGET_AUTH_RUNNING, E_UPDATE_AUTH, S_WIDGET_AUTH_RUNNING, [this](FiniteStateMachine &machine, uint32_t event) { OnStopAuthList(machine, event); }); return builder->Build(); }代码解析
时间: 2024-04-20 07:25:30 浏览: 52
这段代码是一个私有成员函数 MakeFiniteStateMachine() 的实现,返回一个 std::shared_ptr<FiniteStateMachine> 对象。函数内部使用了 FiniteStateMachine::Builder 类来构建有限状态机。
首先,它调用 FiniteStateMachine::Builder::New() 来创建一个新的有限状态机构建器对象,并传入了描述信息和初始状态 S_WIDGET_INIT。如果构建器对象为空,则返回空指针。
接下来,它使用 builder 对象的 MakeTransition() 方法来定义状态之间的转换规则。每个 MakeTransition() 调用都指定了当前状态、触发事件和目标状态,以及与之关联的回调函数。这些回调函数使用 lambda 表达式捕获了当前对象的引用,并调用对象的成员函数来处理相应的事件。
最后,它调用 builder 的 Build() 方法来构建有限状态机,并将其作为 std::shared_ptr<FiniteStateMachine> 对象返回。
这段代码主要用于创建并配置 WidgetScheduleNodeImpl 类中的有限状态机对象,以便在对象的构造函数中使用。有限状态机可以根据触发的事件自动进行状态转换,并执行相应的回调函数来处理这些事件。
相关问题
IDBSEvent * 转到 std::shared_ptr<IDBSEvent>
在C++中,将`IDBSEvent *`类型的指针转换为`std::shared_ptr<IDBSEvent>`,你需要确保已经包含了`#include <memory>`头文件,并且`IDBSEvent`是一个支持移动语义的类。这是因为`std::shared_ptr`通常用于管理智能指针,它会自动处理对象的生命周期管理。
以下是转换的基本步骤:
```cpp
// 假设你有一个IDBSEvent对象或者得到了它的指针
IDBSEvent *ptr = ...;
// 使用std::make_shared创建一个新的shared_ptr,并将原始指针作为构造参数
std::shared_ptr<IDBSEvent> sharedPtr = std::make_shared<IDBSEvent>(ptr);
```
如果`ptr`不是null,并且`IDBSEvent`的复制构造函数可用,则这种转换通常是安全的。然而,如果你的`IDBSEvent`类使用了RAII(Resource Acquisition Is Initialization)策略或异常安全性,确保`ptr`的有效性至关重要。
**相关问题--:**
1. `IDBSEvent`类是否支持移动构造函数?
2. 如果IDBSEvent是非copyable的,该如何进行转换?
3. 如何避免因意外释放原对象而导致的问题?
std::shared_ptr<GateFamily> parentTriggerGate; 如何赋值
`std::shared_ptr<GateFamily>` 是 C++ 中的一个智能指针,它用于管理动态分配的对象资源并自动在不再有外部引用时释放。`parentTriggerGate` 变量声明了一个指向 `GateFamily` 类型的共享所有权指针。
要给这个变量赋值,你可以直接使用 `shared_ptr` 的构造函数,传入你要指向的 `GateFamily` 对象实例:
```cpp
GateFamily gateInstance; // 创建 GateFamily 的实例
parentTriggerGate = std::make_shared<GateFamily>(gateInstance); // 赋值
```
或者如果你已经有现成的 `GateFamily` 对象,也可以这样做:
```cpp
GateFamily existingGate;
parentTriggerGate = std::shared_ptr<GateFamily>(&existingGate);
```
这里使用 `&` 操作符获取 `existingGate` 的地址,并通过它创建一个共享所有权。无论哪种情况,确保你在不再需要 `parentTriggerGate` 指向的对象时,其生命周期管理由 `shared_ptr` 自动处理。
阅读全文