簡體   English   中英

使用枚舉類定義類中的成員

[英]Using Enum Class to define members in class

對於我正在處理的作業,我必須創建枚舉類並使用它們來定義另一個類的成員。 枚舉類如下:

enum class Ball_colors {
    red,
    blue,
    yellow,
    green
};

enum class Ball_sizes {
    small,
    medium,
    large
};

該類稱為“球”,表示具有特定顏色和大小的球。 球的默認構造函數應該隨機選擇顏色和大小,我應該有參數化的構造函數和獲取大小或顏色的函數,但我完全不知道如何使用枚舉類,尤其是在其他類中. 我什至不確定我是否正確定義了類。 如何在另一個類中使用枚舉類,以及如何從枚舉類中隨機選擇某些內容?

好吧,您使用枚舉類的名稱就像使用任何其他普通類的名稱一樣,例如

Ball_colors m_color;

作為班級成員。 然而,由於顏色和尺寸與球本身密切相關,我會將定義嵌套到Ball類中。 然后你也可以刪除前綴:

class Ball
{
    enum class Color { /*...*/ };
    enum class Size { /* ... */ };

    Color m_color;
    Size m_size;
};

而且我會從名稱中刪除復數,如果您以復數形式指定只能表示單個值的成員類型,它看起來並不那么優雅......

如果您需要在外面使用枚舉,您可以將它們作為

Ball::Color::red

現在每個枚舉條目都有一個特定的值,第一個從 0 開始,每個進一步的條目增加 1(除非您明確地為某些或所有條目提供值)。 然后,您可以使用隨機數生成器生成適當范圍內的值並將該值轉換回枚舉,例如:

class Ball
{
    static inline std::mt19937 s_generator { std::random_device()() };
    template <typename T>
    static T get()
    {
        std::uniform_int_distribution<std::underlying_type_t<T>> d
        (
            0, static_cast<std::underlying_type_t<T>>(T::Max) - 1
        );
        return static_cast<T>(d(s_generator));
    }
public:
    Ball()
        : m_color(get<Color>()),
          m_size(get<Size>())
    { }
};

以上假設您向兩個枚舉添加了一個標記值Max (在所有其他條目之后); 或者,您也可以將最大合法值傳遞給模板函數,然后您也不必指定模板參數:

template <typename T>
static T get(T max)
{
    std::uniform_int_distribution<std::underlying_type_t<T>> d
    (
        0, static_cast<std::underlying_type_t<T>>(max)
    );
    return static_cast<T>(d(s_generator));
}

Ball()
    : m_color(get(Color::green))
    // ...

但是,如果您向枚舉添加更多值,您將密切關注第二個位置,以便進行調整!

只是有類似的東西:

struct Ball
{
    Ball_colors color = Ball_colors::red;
    Ball_sizes size = Ball_sizes::small;

    Ball(Ball_colors color, Ball_sizes size) : color(color), size(size) {}
};

您可以像定義類的其他數據成員一樣定義枚舉類類型的類的數據成員。

這是一個演示程序。

#include <iostream>
#include <string>

enum class Ball_colors {
    red,
    blue,
    yellow,
    green
};

enum class Ball_sizes {
    small,
    medium,
    large
};

class Ball
{
private:
    Ball_colors color = Ball_colors::red;
    Ball_sizes size = Ball_sizes::small;

public:
    Ball() = default;
    Ball( Ball_colors color, Ball_sizes size ) : color( color ), size( size )
    {
    }

    std::string to_string() const
    {
        const char *string_colors[] = { "red", "blue", "yellow", "green" };
        const char *string_sizes[]  = { "small", "medium", "large" };

        std::string s( "The ball is " );
        return s + string_sizes[static_cast<size_t>( size )] + 
               " and " + string_colors[static_cast<size_t>( color )] + ".";
    }
};

int main() 
{
    Ball ball1;

    std::cout << ball1.to_string() << '\n';

    Ball ball2( Ball_colors::blue, Ball_sizes::large );

    std::cout << ball2.to_string() << '\n';

    return 0;
}

它的輸出是

The ball is small and red.
The ball is large and blue.

暫無
暫無

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

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