我想为对象的某些(难以计算)布尔属性创建缓存。我想到的结构如下:
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(真)。但这使得我的代码不太明显。毕竟,这些属性是布尔值,而我的缓存结构实际上也包含一些(实际)整数和双精度。
处理这个问题的最佳方法是什么?或者我是否忽略了一些非常简单的测试,以检查布尔值是否未初始化?
答案 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
变量。
另一种首选方法是始终在struct
,class
或函数的构造函数中初始化它们。
编辑1:
如果将变量定义为static
,则它将在main
之前初始化(与全局变量一样)或在第一次进入函数时初始化。
在您的情况下,我强烈建议您创建一个constructor
方法来初始化struct
中的变量。