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

how to check whether a boolean is uninitialized in c++?

本文关键字:布尔值 是否 初始化 检查 c++      更新时间:2023-10-16

我想为对象的一些(难以计算)布尔属性创建一个缓存。我脑海中的结构如下:

   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) 使我的结构的成员成为bool*指针。然后我可以检查nullptr,但这使我的函数有点麻烦,因为我必须new/delete所有的布尔对象

2) 使我的结构的成员成为int。然后我可以将它们初始化为-1,并分配0(false)或1(true)。但是这使得我的代码不那么明显了。毕竟,这些属性是布尔的,而我的缓存结构实际上也包含一些(真实的)int和double。

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

如果您只有两个属性:

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;
}

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

/// 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状态的名称(大写与非大写)

有C++11,我更喜欢:

struct Some
{
    bool property = false;
};

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

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

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

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

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

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