gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:09 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com