如何在c ++中检查布尔值是否未初始化?

时间:2015-02-12 19:26:53

标签: c++ caching initialization boolean

我想为对象的某些(难以计算)布尔属性创建缓存。我想到的结构如下:

   class Obj; 
   struct ObjProperties
   {
       bool property1;
       bool property2;
       // etc.
   };
   std::unordered_map<const Obj*, ObjectProperties> cache;

现在我想拥有类似

的功能
bool hasProperty1()
{
    if /*(cache[property1] is uninitialized)*/
         cache[property1] = calculateProperty1();
    return cache[propery1];
}

然而,我如何检查布尔值是否未初始化? Property1可以是true或false,因此我无法将其初始化为值...

我认为有两种方法可以解决这个问题:

1)使我的struct bool*指针成员。然后我可以检查nullptr,但这会使我的函数变得更麻烦,因为我必须new / delete我所有的布尔对象

2)制作我的结构int的成员。然后我可以将它们初始化为-1并指定0(假)或1(真)。但这使得我的代码不太明显。毕竟,这些属性是布尔值,而我的缓存结构实际上也包含一些(实际)整数和双精度。

处理这个问题的最佳方法是什么?或者我是否忽略了一些非常简单的测试,以检查布尔值是否未初始化?

3 个答案:

答案 0 :(得分:1)

您不能强制执行内置类型的初始化,但您可以使用包装器(如果是偏执的,请查询):

/// Initialize a type with zero.
template <typename T>
struct Zero
{
    T value;
    operator const T& () const { return value; }
    operator T& () { return value; }

    Zero()
    :   value(0)
    {}

    Zero(const T& initializer)
    :   value(initializer)
    {}
}; 

struct Some
{
    Zero<bool> property;
};

以上仅确保零(错误)初始化。您可以更改模板以支持true(也),或选择反映false状态的名称(大写与no_uppercase)

拥有C ++ 11,我更喜欢:

struct Some
{
    bool property = false;
};

如果未初始化成员,则具有未明确定义的行为。

答案 1 :(得分:1)

如果你只有几个属性:

class ObjProperties
{
  bool property1;
  bool property1_valid;
  bool property2;
  bool property2_valid;

  ObjProperties() : property1_valid(false), property2_valid(false)
  {}
}

您可以实现特殊的属性类型:

struct BoolProperty
{
  bool value;
  bool valid;
  BoolProperty() : value(false), valid(false) {}
  BoolProperty(bool value) : value(value), valid(true) {}
  BoolProperty &operator=(const bool &arg)
  {
     value = arg;
     valid = true;
  }
  bool isValid() const { return valid; }
  ...
}
class ObjProperties
{
  BoolProperty property1;
  BoolProperty property2;
}

或者你可以使用一些位字段:

class ObjProperties
{
  bool property1;
  bool property2;
  int property1_valid:1;
  int property2_valid:1;
}

答案 2 :(得分:0)

您无法立即查明是否已初始化POD类型。编译器分配变量的内存将具有值;它是否有效取决于你。

判断变量是否初始化的一种方法是使用bool变量。

另一种首选方法是始终在structclass或函数的构造函数中初始化它们。

编辑1:
如果将变量定义为static,则它将在main之前初始化(与全局变量一样)或在第一次进入函数时初始化。

在您的情况下,我强烈建议您创建一个constructor方法来初始化struct中的变量。

相关问题