处理C++类中的多个状态

sab*_*e3d 4 c++

在C++类中处理状态的最有效和最现代的方法是什么?目前我正在使用多个bool,但我说的越多,我就越难以维持.例如,如果我有一个名为VideoPlayer的类,它有四个bool定义不同的状态.如果我们为每个bool添加set方法,我们需要取消设置所有其他bool.

class VideoPlayer
{

public:
    void play()
    {
        play_ = true;
        pause_ = false;
        stop_ = false;
        reset_ = false;
    }

    void stop()
    {
        stop_ = true;
        play_ = false;
        pause_ = false;
        reset_ = false;
    }

private:
    bool play_;
    bool pause_;
    bool stop_;
    bool reset_;
};
Run Code Online (Sandbox Code Playgroud)

Dai*_*Dai 8

你的设计患有它在一个糟糕的状态容易被(例如,如果两者stop_play_true

您应该使用a enum来定义一组有限状态,在任何给定的时间点只能有1个有效状态.

C++的enum类型与Swift,Java和C#有些不同enum:它们是无范围的,并且通过隐式转换更加宽松 - 行为有点类似于#define.

C++ 11增加了enum class与C#非常相似的东西enum.但是,没有类似于Java或Swift的灵活性的内置功能enum.

你会想要这样的东西:

enum class PlayerState {
    Stopped,
    Playing,
    Paused
}
Run Code Online (Sandbox Code Playgroud)

如果Reset不是状态,而是动词,那么它不应该在enum定义中.

class VideoPlayer {
private:
    PlayerState state;
public:
    VideoPlayer() :
        state( PlayerState::Stopped )
    {

    }

    void play() {

        switch( this->state ) {
            case PlayerState::Stopped:
                 // start video here, only change `state` when complete.
                // you might want to add a "BeginPlaying" (e.g. `LoadingFileFromDisk`) state value too.
                this->state = PlayerState.Playing;
                break;
            case PlayerState::Playing:
                throw VideoPlayerStateExeception("Already playing");
            case PlayerState::Paused:
                this->resume();
                break;
        }
    }


}
Run Code Online (Sandbox Code Playgroud)