C ++避免将NULL比较为0

时间:2017-01-16 21:34:27

标签: c++

因为在C ++中,NULL是必不可少的jus 0.每次我将一个未初始化的变量设置为NULL,之后我想通过将它与NULL进行比较来检查该变量是否被初始化。但是,如果变量恰好在某处分配给0,那么我无法判断它是否已经初始化。我肯定可以做一些工作来避免使用另一个包装对象来包装变量或使用标志的情况。但我正在寻找更优雅的解决方案。例如:

int b[4] = {1,2,3,0};
int a = NULL;
int i = 0;
while(true){
    if(a == 0)return;
    a = b[i++];
}

所以这里它将立即进入if语句,但我想等待 直到a由b的最后一个元素

指定为0

2 个答案:

答案 0 :(得分:6)

我认为您正在寻找的是boost::optional

#include <boost/optional.hpp>

...

boost::optional<int> maybe_int;

...

if (maybe_int) // test if it has been assigned to
{
    if (maybe_int.value() == 0) // has is been set to zero?
    {
        // ...
    }
}    

答案 1 :(得分:3)

我认为你在这里犯了一个概念上的错误。尽管NULL在某处被定义为0,但这并不意味着它们在概念层面上是相同的。

NULL是一个带(通常)值0的指针。按照惯例,NULL处不能有对象。因此,我们可以使用MyClass *obj = NULL;之类的代码来指定obj处没有对象。这是有效的,因为obj是一个指针。

对于非指针类型,这不起作用,我们需要使用其他工具,例如任意将一个值定义为无效(通常-1用于此)或使用optionals