簡體   English   中英

如何檢查布爾值是否在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)使我的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變量。

另一種首選的方法是始終在structclass或function的構造函數中初始化它們。

編輯1:
如果將變量定義為static ,則它將在main之前(與全局變量一樣)或在首次進入函數時進行初始化。

在您的情況下,強烈建議您創建一個constructor方法,以初始化struct的變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM