[英]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)使我的struct bool*
指針的成員。 然后我可以檢查nullptr
,但是這會使我的函數更加麻煩,因為我必須new
/ delete
所有布爾對象。
2)使我的struct int
的成員。 然后,我可以將它們初始化為-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(也可以),或者選擇反映錯誤狀態的名稱(大寫vs. no_uppercase)
擁有C ++ 11,我更喜歡:
struct Some
{
bool property = false;
};
如果成員未初始化,則行為不明確。
如果您只有幾個屬性:
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;
}
您無法立即發現POD類型是否已初始化。 編譯器將變量分配給的內存將具有一個值; 是否有效取決於您。
判斷變量是否已初始化的一種方法是使用bool
變量。
另一種首選的方法是始終在struct
, class
或function的構造函數中初始化它們。
編輯1:
如果將變量定義為static
,則它將在main
之前(與全局變量一樣)或在首次進入函數時進行初始化。
在您的情況下,強烈建議您創建一個constructor
方法,以初始化struct
的變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.