在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)
你的设计患有它在一个糟糕的状态容易被(例如,如果两者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)