簡體   English   中英

如何檢查類中已定義的枚舉類型變量是否已分配?

[英]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.

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