2016-03-05 92 views
-1

我有一個包含整數x量的結構,這是要求他們每個最後一個非零。這裏是我的結構:檢查任何結構成員0

struct thingy_t{ 
    int a, b, c /* and so on */; 

    bool init(); 
}; 

隨着時間的推移,我會加入許多其他成員的結構,這使得它一個問題,如果我忘記檢查,如果它是非零。這就是爲什麼我想爲每個成員實現自動化的原因。

在我init功能,它試圖獲取值的成員,並返回false,如果其中任何一個都是0

到目前爲止,我有這樣的:

bool thingy_t::init(){ 
    a = GetValue(/* blah blah */); // Will return 0 if it can't find anything 
    b = GetValue(/* other blah */); 
    /* and so on */ 

    // Check if any value is zero 
    for(int* i = (int*)this 
    ; i < (int*)((char*)this + sizeof(interfaces_t)) 
    ; i++){ 
     if(!*i) return false; 
    } 

    return true; 
} 

我要尋找一個更好的方式來做到這一點,將更可讀和更安全的內存,因爲我正在玩火(指針)在他們可能不是打算。

而且,遺憾的for循環,我試圖使通過包裝它,它更具可讀性,但我可能使病情加重。

+4

如果您要更改數據類型「* over time *」更大的問題,然後零值。做出更好的設計。 – Amit

+2

如何製作一個包裝類,它的行爲像一個int(在正確的重載操作符的幫助下),但有一個約束,它不能爲零。然後使用這個'nonzero_int'而不是'int'作爲你的成員。 –

+0

或者如果你改用'int'的數組,你可以很容易地檢查它們是否都是非零的。 –

回答

0

我解決我自己的問題,一邊享受美味的早餐。

這裏是我如何解決它:

struct thingy_t{ 
    union{ 
     struct{ 
      int a, b, c; 
     } 
     int arr[3]; 
    } 
} 

這樣我可以通過訪問變量。他們的名字以及它們在數組中的索引,因此我可以檢查每個值是否非零更容易(聲明:James Root爲數組靈感)

0

沒有遍歷結構,並檢查你有成員的特定值以自然的方式,讓你更好的選擇,在我看來,應該是做出更好的設計爲您的任務,或作確保您檢查每次訪問該結構時的錯誤值。

0

我最好簡單實現以包含int或(可能更好)的標準容器的陣列的類型。

如果在編譯時被指定的值的數目....

struct thingy_t 
{ 
    int x[number];  

    bool all_non_zero() const; 

}; 

bool thingy_t::all_non_zero() const 
{ 
    for (int i = 0; i < number; ++i) 
     if (!number[i]) return false; 
    return true;   
} 

如果在編譯時沒有指定數目,我會使用一個標準容器

struct thingy_t 
{ 
    std::vector<int> x; 

    thingy_t(std::size_t size) : x(size) {}; 
    bool all_non_zero() const; 

}; 

bool thingy_t::all_non_zero() const 
{ 
    for (std::vector<int>::const_iterator it = x.begin(), end = x.end(); 
      it != end number; ++it) 
     if (!(*it)) return false; 
    return true;   
} 

的以上適用於所有版本的C++,但可以在C++ 11或更高版本中進行簡化。

bool thingy_t::all_non_zero() const 
{ 
    for (const auto &element : x) 
     if (!element) return false; 
    return true;   
} 

當然,您將需要其他函數來實際存儲數組或向量中的值。

的代碼不會改變,如果的整數的數量變化。您需要以某種方式分別跟蹤每個元素的含義。