[英]How to check a defined enum type variable in a class was assigned to or not?
我想檢查一個類中的變量是否已設置? 我該怎么做?
enum Color {
red,
blue
};
class example {
Color c;
void set_color(Color c) { this->c = c; }
Color get_color() { return c; }
bool check_color_is_set() {
if (c == Color) {} // compile error
if (c == NULL) {} // compile error
return true;
}
我想知道變量Color c
已分配?
除了沒有賦值(如在@ code707的答案中 ),你可以做一些事情。
如果用戶正確調用set,則所有都基於存儲bool。
使用get / set封裝來檢查它是否已設置:
class example {
private:
Color color;
bool isColourSet = false;
public:
Color get_color() const;
void set_color(Color newCol) {
color = newCol;
isColourSet = true;
}
...
然后你可以根據你的願望以各種方式使用這個bool:
拋出一個例外
Color get_color() const {
if (!isColourSet) throw some_exception; // It wasnt Set!! Throw
return color;
}
這樣,您就沒有額外的枚舉元素,並且可以防止通過拋出異常來拋出未定義的值。
返回錯誤代碼
如果您不想拋出異常,可以傳遞一個return參數並返回錯誤:
ErrInt get_colour(Colour &out) const {
if (!isColourSet) return STANDARD_ERROR_VAL;
out = color;
return STANDARD_SUCCESS_VALUE;
}
這與枚舉中的Bad Value概念非常相似。
使用std::optional
從c++17
你也有了一種新的方式std::optional
,你可以選擇返回(而不是拋出異常或返回錯誤值)。
class example {
public:
std::optional<Color> get_colour() {
return color;
}
void set_color(Color newColor) {
color = newColor;
}
private:
std::optional<Color> color;
}
然后用戶可以這樣使用它:
auto myColor = myExample.get_colour();
if (myColour) { // Here you can check the optional
myColour.get() // Do something with colour.
...
與設置值並檢查是否已正確設置相反,也許您可以設計類,使其永遠不會處於無效狀態。 讓我們來看看我們如何做到這一點:
1類型安全
我們不希望用戶能夠為我們不知道的顏色設置隨機值。 在當前實現中, enum
將是一個可以使用任何int
值設置的類型! 有人做set_color(538)
是什么意思? 我們可以用c ++ 11 enum class
解決這個問題:
enum class Color {
RED,
BLUE
}
// This now causes a compiler error:
set_color(523);
// You can only use it like this:
set_color(Color::Red);
2構造函數參數
我們可以通過僅提供需要顏色的構造函數來強制用戶選擇初始顏色:
class example {
public:
example(Color startColor) : color(startColor) {}
...
private:
Color c;
}
這意味着如果沒有初始顏色,用戶將無法創建該類。 現在我們可以添加我們的set函數,以防用戶想要更改顏色:
void change_color(Color newColor) {
color = newColor;
}
3結論
現在你有一個類,用戶永遠不會陷入無效的狀態。 我相信這比嘗試檢測用戶是否填寫了創建類要好得多。
如何為“未分配”賦予特殊價值?
enum Color {
nocolor,
red,
blue
};
class example {
Color c = nocolor;
void set_color(Color c) { this->c = c; }
Color get_color() { return c; }
bool check_color_is_set() {
if (c == nocolor) {}
return true;
}
如果你對使用boost庫沒有猶豫,那么也許你可以使用boost::optional
來做到這一點。
#include <boost/optional.hpp>
enum Color {
red,
blue
};
class example
{
boost::optional<Color> c;
void set_color(Color c) { this->c = c; }
Color get_color() { return c; }
bool check_color_is_set()
{
if( c ){
// color is set
return true;
}
else
{
// color is not set.
return false;
}
}
}
boost::optional<Color> c
的默認值默認為boost::none
。 您可以對其執行常規if檢查並查看是否已設置了某些內容。
以下是Boost Optional的文檔供您參考。
注意:我沒有使用STL版本的可選項,但如果您對使用Boost不感興趣,也可以使用std::optional
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.