#c #c 11
#c #c 11
Вопрос:
У меня есть класс timer, внутри класса есть флаг. Когда мы не вызывали 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, каждое число означает разные вещи. Иногда я путаюсь в своем собственном коде, мне приходится внимательно читать комментарии, чтобы понять, что я делаю. Есть ли четкий способ обработки этого флага? Спасибо.
Комментарии:
1. Как насчет использования
enum
вместо?2. То, что вам нужно, это перечисление
3. Добавьте
enum
для него.4. Для таймеров предпочитайте такую терминологию, как «start», тем более, что она сравнивается с «end»
5. Спасибо за все ваши комментарии, это действительно помогает.
Ответ №1:
Вы можете добавить перечисление и использовать это значение в своем коде, чтобы код не требовал пояснений:
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;
}
Комментарии:
1. Почему бы не сохранить
flag
asflag_states
вместоint
?2. Спасибо @Gill Bates, это действительно здорово.