c++ - 在 C++ 类中处理多个状态

标签 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_;
};

最佳答案

您的设计很容易处于不良状态(例如,如果 stop_play_ 都为 true 怎么办?

您应该使用enum 来定义set of finite-states其中只有 1 个可以在任何给定时间点处于事件状态。

C++ 的 enum 类型与 Swift、Java 和 C# 的 enum 有点不同:它们没有作用域并且对隐式转换更宽松 - 行为有点类似于 #定义

C++11增加了enum class,这与C#的enum非常相似。但是,没有类似于 Java 或 Swift 的 enum 的灵 active 的内置功能。<​​/p>

你会想要这样的东西:

enum class PlayerState {
    Stopped,
    Playing,
    Paused
}

如果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;
        }
    }


}

关于c++ - 在 C++ 类中处理多个状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40754161/

相关文章:

c++ - 自定义迭代器的 cbegin 未被使用

C++如何使用less条件语句?

c++ - C++ 模块是否不存在 ODR 违规?

c++ - 在 C++ 中 float 比 IEEE 754 更小的范围

c++ - 不能在 ctor 初始化列表中调用 std::atomic::store

c++ - 在 C++ 中声明可变长度二维数组的正确方法

c++ - 我可以从调试二进制文件重建 C++ 源代码吗?

c++ - 有没有办法让这段代码更快?

c++ - 用户定义类型的隐式类型转换

c++ - 使用模板类重载 [] 运算符时出现问题