0

假设一次需要多个比较:

enum usermode
{
    active,
    standingby,
    inactive,
    dead,
    // many other modes....
};
class A
{
public:
    usermode mode;
};

函数继承指向类 A 的指针(ptr 指向 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
}

这样做是个好习惯吗?

4

3 回答 3

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...
}
于 2012-09-21T22:55:37.193 回答
2

由于mode它只是类的一个成员变量,任何体面的编译器都会为两种实现生成相同的代码。但是,通常,如果您使用方法而不是字段(尤其是具有副作用的方法),这两种方法是不等价的。

这在函数调用与局部变量中有更多详细信息

于 2012-09-21T22:56:48.063 回答
0

如果您的班级有直接处理此问题的方法可能会更好

bool A::IsSomeState() const
{
  return mode == active || mode == standingby; // Etc
}
于 2012-09-21T22:56:06.180 回答