如何在c++中检查布尔值是否未初始化
how to check whether a boolean is uninitialized in c++?
我想为对象的一些(难以计算)布尔属性创建一个缓存。我脑海中的结构如下:
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
变量。
另一种优选的方法是始终在struct
、class
或函数的构造函数中初始化它们。
编辑1:
如果将变量定义为static
,则它将在main
之前初始化(与全局变量一样),或者在函数的第一个条目时初始化。
在您的情况下,我强烈建议您创建一个constructor
方法来初始化struct
中的变量。
- 检查类是否具有模板专用化(使用布尔值或 int 等模板参数)
- 布尔值是否需要在C++中表示为真时设置为 1 位/假时设置为 0 位
- 如何检查 C++ 中是否存在布尔值
- 是否应在分配时将布尔值截断为 true 或 false
- 将布尔值或浮点数分配给int32_t是否安全?
- 在一个作用域中推送五个对象指针,然后检查对象的布尔值是否为 false,会给出错误
- 编译器中的布尔值为 8 位.对它们的操作是否效率低下
- 特征稀疏布尔矩阵是否存储非零值
- 在命令行程序中使用布尔值。找不到定义标志并检查它们是否在参数中的方法
- 是否存在简单的指向布尔值作为线程取消标志的现实情况,无法有效地取消线程?
- x&=y 是否等同于 x = x &&y 如果两者都是 c++ 布尔值
- 是否有任何理由在C 中使用布尔值的枚举,而不是已经存在的布尔
- 检查数组中的所有布尔值是否为真
- 对布尔值使用逐位not运算符(~)是否会调用Undefined Behavior
- 如何在c++中检查布尔值是否未初始化
- 在比较过程中C++布尔值是否转换为整数
- 移动后是否应该 std::function::运算符布尔值返回 false
- 检查布尔值是否在混合 C/C++ 中定义
- C++编译器是否可以在内部用 0 或 1 以外的内容表示布尔值
- 在线程间的控制流中使用不带互斥锁的非原子布尔值是否安全?