在 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/