假设一次需要多次比较:
enum usermode
{
active,
standingby,
inactive,
dead,
// many other modes....
};
class A
{
public:
usermode mode;
};
函数继承了指向A类的指针(ptr指向A)
方法A:
if( ptr->mode == active || ptr->mode == standingby || ptr->mode == inactive || ptr->mode == dead ...//etc )
{
//do something
}
方法B:
usermode cmpmode = ptr->mode;
if( cmpmode == active || cmpmode == standingby || cmpmode == inactive || cmpmode == dead ...//etc )
{
//do something
}
这样做是否是一种好习惯?
答案 0 :(得分:2)
在这种情况下,它只是减少if
语句表达式中的字符数量,因此无论哪种方法都有效且最具可读性。
但是,在检查函数的返回值的情况下,我会将它填入变量并检查,即
auto ret = SomePossiblyExpensiveOperation();
if(ret != whatever && ret < something) {
//...
}
以if
语句表达,我会这样做:
switch(ptr->mode) {
case active:
case standingby:
case inactive:
case dead:
ptr->whatever();
break;
// other cases
default:
// something else
break:
}
如果这是一个常见的检查,你可能想要为它做一个特例,即
usermode any_mode = active | standingby | inactive | dead;
//...
if(ptr->mode & any_mode) {
// whatever...
}
答案 1 :(得分:2)
由于mode
只是类的成员变量,所以任何体面的编译器都会为这两个实现生成相同的代码。但是,一般来说,如果您使用方法而不是字段(尤其是带副作用的方法),这两种方法并不等效。
答案 2 :(得分:0)
如果你的班级有一个直接处理这个问题的方法可能会更好
bool A::IsSomeState() const
{
return mode == active || mode == standingby; // Etc
}