检查两个对象组合是否为null的最佳方法

时间:2018-11-16 10:01:21

标签: c++ coding-style

很久以来我一直想问这个问题。花了一些时间后,我感觉无法获得一种正确的方法来一起检查两个对象是否为null,所以我问它。

例如:我有一个这样的功能

int Function(Object* obj1, Object* obj2) 
{
   if(obj1 == null && obj2 == null)
   { 
       // Do someting........
   }
   else if(obj1 == null && obj2 != null)
   { 
       // Do something.....
   }
   else if(obj1 != null && obj2 == null)
   {
       // Do something......
   }
   else
   {
       // Do something........
   }
   return 0;

如我们所见,仅检查两个对象的组合是否为空的条件就太多了。

还有其他方法可以更有效地做到这一点,以提高可读性吗?

注意:对象是一个类,没有运算符被重载。

2 个答案:

答案 0 :(得分:1)

您最多需要执行两次比较。这就是我的方法:

if( obj1 )
{
    if( obj2 )
    {
        // obj1 and obj2 are both valid.
    }
    else
    {
        // obj1 is valid, obj2 is nullptr.
    }
}
else
{
    if( obj2 )
    {
        // obj1 is nullptr, obj2 is valid.
    }
    else
    {
        // Both are nullptr.
    }
}

答案 1 :(得分:-2)

主要思想是减少 if ... else 分支的数量。 也许是某种调度程序,诸如此类:

df.groupby(['year', 'item_id']).sum().reset_index().drop('month', axis=1).set_index('item_id')

         year  revenue
item_id               
1        2013     18.0
2        2013      5.0
3        2013      5.0
1        2014     10.0

其中 f1-f4 是一些功能,例如

int ptr_pair_state(const obj1 *p1, const obj1 *p2)
{
    return (p1 ? 1 : 0) | (p2 ? 2 : 0);
}

int Function(Object* obj1, Object* obj2)
{
    std::map<int, std::function<void()>> disp{ { 0, f1 }, { 1, f2 }, { 2, f3 }, {3, f4 } };
    int state = ptr_pair_state(obj1, obj2);
    disp[state]();
}

但是,这似乎是不必要的复杂性,因此,另一个简单的选择-使用switch运算符:

void f1()
{
    std::cout << "f1";
}

比无尽的 if ... elif if