我有一个计时器类,在类中有一个标志。当我们不调用init()时,标志为0。调用init()后,它将设置为1。调用end()之后,它将被设置回0。

class TimerHao
{
 private:
    double seconds;
    int    flag=0;  //0: Have not start accumulation. 1: In accumulation, between init() and end();

 public:

    void init();
    void end();
};

void TimerHao::init()
{
    if(flag!=0) { throw runtime_error( "ERROR!!! Cannot initial the timer before it is ended!" ); }
    ...
    flag=1;
}

void TimerHao::end()
{
    if(flag!=1) { throw runtime_error("ERROR!!! Cannot end the timer before it is initialized!");}
    ...
    flag=0;
}

我可以通过以下方式使用代码:
 TimerHao timerhao;
 timerhao.init();
 ...
 timerhao.end();
 ...
 timerhao.init();
 ...
 timerhao.end();
 ...

我不喜欢将标志设置为整数,我需要阅读注释以了解其含义。实际上,我在代码中经常使用这种类型的标志,例如标志可以是0、1、2、3、5,每个数字表示不同的含义。有时,我对自己的代码感到困惑,我必须仔细阅读注释才能理解自己在做什么。有没有明确的方法来处理此标志?谢谢。

最佳答案

您可以添加枚举并在代码中使用该值,因此代码是不言自明的:

class TimerHao
{
 private:

    enum flag_states
    {
        FLAG_STATE_NOT_STARTED = 0,
        FLAG_STATE_IN_ACCUMULATION,
        // etc
    };

    double seconds;
    flag_states flag = FLAG_STATE_NOT_STARTED;  //0: Have not start accumulation. 1: In accumulation, between init() and end();

 public:

    void init();
    void end();
};

void TimerHao::init()
{
    if(flag != FLAG_STATE_NOT_STARTED) { throw runtime_error( "ERROR!!! Cannot initial the timer before it is ended!" ); }

    flag = FLAG_STATE_IN_ACCUMULATION;
}

void TimerHao::end()
{
    if(flag != FLAG_STATE_IN_ACCUMULATION) { throw runtime_error("ERROR!!! Cannot end the timer before it is initialized!");}

    flag= FLAG_STATE_NOT_STARTED;
}

如果您有权使用C++ 11,甚至可以将其设为作用域枚举,并禁止强制转换:
class TimerHao
{
 private:

    enum class flag_states
    {
        FLAG_STATE_NOT_STARTED = 0,
        FLAG_STATE_IN_ACCUMULATION,
        // etc
    };

    double seconds;
    flag_states flag = flag_states::FLAG_STATE_NOT_STARTED;  //0: Have not start accumulation. 1: In accumulation, between init() and end();

 public:

    void init();
    void end();
};

void TimerHao::init()
{
    if(flag != flag_states::FLAG_STATE_NOT_STARTED) { throw runtime_error( "ERROR!!! Cannot initial the timer before it is ended!" ); }

    flag = flag_states::FLAG_STATE_IN_ACCUMULATION;
}

void TimerHao::end()
{
    if(flag != flag_states::FLAG_STATE_IN_ACCUMULATION) { throw runtime_error("ERROR!!! Cannot end the timer before it is initialized!");}

    flag= flag_states::FLAG_STATE_NOT_STARTED;
}

10-08 08:29
查看更多