C++写一个简单的状态机实现

在C++中实现一个事件驱动的状态机,您可以在StateMachine类中添加事件枚举和处理事件的方法。以下是一个简单的事件驱动状态机示例:

#include <iostream>

// 定义状态枚举
enum class State {
    Idle,
    Running,
    Paused,
    Stopped
};

// 定义事件枚举
enum class Event {
    Start,
    Pause,
    Resume,
    Stop
};

class StateMachine {
private:
    State currentState;

public:
    StateMachine() : currentState(State::Idle) {}

    void handleEvent(Event event) {
        switch (event) {
            case Event::Start:
                start();
                break;
            case Event::Pause:
                pause();
                break;
            case Event::Resume:
                resume();
                break;
            case Event::Stop:
                stop();
                break;
        }
    }

private:
    void start() {
        if (currentState == State::Idle || currentState == State::Stopped) {
            currentState = State::Running;
            std::cout << "状态已更改为:运行中" << std::endl;
        } else {
            std::cout << "无法启动:状态机已进行中或处于暂停状态" << std::endl;
        }
    }

    void pause() {
        if (currentState == State::Running) {
            currentState = State::Paused;
            std::cout << "状态已更改为:暂停" << std::endl;
        } else {
            std::cout << "无法暂停:状态机未运行" << std::endl;
        }
    }

    void resume() {
        if (currentState == State::Paused) {
            currentState = State::Running;
            std::cout << "状态已更改为:运行中" << std::endl;
        } else {
            std::cout << "无法恢复:状态机未暂停" << std::endl;
        }
    }

    void stop() {
        if (currentState == State::Running || currentState == State::Paused) {
            currentState = State::Stopped;
            std::cout << "状态已更改为:停止" << std::endl;
        } else {
            std::cout << "无法停止:状态机未运行或暂停" << std::endl;
        }
    }

public:
    State getState() const {
        return currentState;
    }
};

int main() {
    StateMachine stateMachine;

    stateMachine.handleEvent(Event::Start);
    stateMachine.handleEvent(Event::Pause);
    stateMachine.handleEvent(Event::Resume);
    stateMachine.handleEvent(Event::Stop);

    return 0;
}

在这个示例中,我们添加了一个名为Event的枚举以表示可能的事件。我们还为StateMachine类添加了一个handleEvent方法,该方法接收一个Event参数并根据事件类型调用相应的函数(如start、pause等)。现在,在main函数中,您可以通过调用stateMachine.handleEvent并传递相应的事件来测试状态跳转。 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单状态机示例,它将字符串解析为整数,并根据输入字符切换状态。 ```c typedef enum { STATE_START, // 初始状态 STATE_INT, // 数字状态 STATE_END, // 结束状态 STATE_ERROR // 错误状态 } State; int str_to_int(const char *str) { State state = STATE_START; int result = 0; int sign = 0; while (*str != '\0') { char c = *str++; switch (state) { case STATE_START: if (c == '+') { sign = 1; state = STATE_INT; } else if (c == '-') { sign = -1; state = STATE_INT; } else if (isdigit(c)) { result = c - '0'; state = STATE_INT; } else if (isspace(c)) { // 无操作 } else { state = STATE_ERROR; } break; case STATE_INT: if (isdigit(c)) { result = result * 10 + (c - '0'); } else if (isspace(c)) { state = STATE_END; } else { state = STATE_ERROR; } break; default: state = STATE_ERROR; break; } } return (state == STATE_END) ? result * sign : 0; } ``` 代码通过 `switch` 语句实现状态转移,并使用枚举常量定义状态。在 `STATE_START` 状态下,代码将读取输入字符,如果是 `+`、`-` 和数字,它将设置符号和结果,并进入 `STATE_INT` 状态。如果输入字符是空格,则状态转移到下一个字符。在 `STATE_INT` 状态下,代码将读取输入字符,如果是数字,则更新结果,否则退出循环。如果输入字符是空格,则将状态设置为 `STATE_END`,结束循环。如果输入不是数字或空格,则将状态设置为 `STATE_ERROR`。最后,如果状态为 `STATE_END`,则返回结果和符号的乘积,否则返回 0。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值