首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建对象的副本以进行多次比较是一种好的做法吗?

创建对象的副本以进行多次比较是一种好的做法吗?
EN

Stack Overflow用户
提问于 2012-09-22 06:50:56
回答 3查看 69关注 0票数 0

假设一次需要多个比较:

代码语言:javascript
复制
enum usermode
{
    active,
    standingby,
    inactive,
    dead,
    // many other modes....
};
class A
{
public:
    usermode mode;
};

指向类A的函数继承指针(ptr指向A)

方法A:

代码语言:javascript
复制
if( ptr->mode == active || ptr->mode == standingby || ptr->mode == inactive || ptr->mode == dead ...//etc )
{
    //do something
}

方法B:

代码语言:javascript
复制
usermode cmpmode = ptr->mode;
if( cmpmode == active || cmpmode == standingby || cmpmode == inactive || cmpmode == dead ...//etc )
{
    //do something
}

这样做是一种好的做法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-22 06:55:37

在这种情况下,它只是减少了if语句表达式中的字符数,所以无论什么都行得通,而且最具可读性。

然而,在检查函数的返回值的情况下,我会将其填充到一个变量中并检查,即,

代码语言:javascript
复制
auto ret = SomePossiblyExpensiveOperation();
if(ret != whatever && ret < something) {
    //...
}

从表面上看你的if语句,我会这样做:

代码语言:javascript
复制
switch(ptr->mode) {
    case active:
    case standingby:
    case inactive:
    case dead:
        ptr->whatever();
        break;
    // other cases
    default:
        // something else
        break:
}

如果这是一张普通的支票,你可能想为它做一个特例,即,

代码语言:javascript
复制
usermode any_mode = active | standingby | inactive | dead;

//...

if(ptr->mode & any_mode) {
    // whatever...
}
票数 2
EN

Stack Overflow用户

发布于 2012-09-22 06:56:48

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

有关这一点的更多细节,请访问Function calls vs. local variables

票数 2
EN

Stack Overflow用户

发布于 2012-09-22 06:56:06

如果您的类有一个直接处理此问题的方法,可能会更好

代码语言:javascript
复制
bool A::IsSomeState() const
{
  return mode == active || mode == standingby; // Etc
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12539115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档