【问题标题】:Using Enum Class to define members in class使用 Enum Class 定义类中的成员
【发布时间】:2020-01-21 15:48:56
【问题描述】:

对于我正在处理的任务,我必须创建枚举类并使用它们来定义另一个类的成员。枚举类如下:

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

enum class Ball_sizes {
    small,
    medium,
    large
};

这个类,叫做“ball”,代表一个特定颜色和大小的球。球的默认构造函数应该随机选择颜色和大小,我应该有参数化构造函数,以及获取大小或颜色的函数,但我完全不知道如何使用枚举类,尤其是在其他类中.我什至不确定我是否正确定义了这些类。如何在另一个类中使用枚举类,如何从枚举类中随机选择一些东西?

【问题讨论】:

  • 到目前为止你做了什么,为什么它不起作用?请注意,SO 不是“做我的功课”网站。

标签: c++ class enums enumeration


【解决方案1】:

好吧,您使用枚举类的名称就像使用任何其他普通类的名称一样,例如。 g.

Ball_colors m_color;

作为班级成员。但是,由于颜色和大小与球本身密切相关,我将定义嵌套到 Ball 类中。然后你也可以去掉前缀:

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

    Color m_color;
    Size m_size;
};

我会从名称中去掉复数,如果你指定一个只能表示单个值的复数成员类型,它看起来就不那么优雅了...

如果你需要在外面使用枚举,你可以将它们寻址为

Ball::Color::red

现在每个枚举条目都有一个特定的值,第一个从 0 开始,每一个进一步增加一个(除非您明确地为部分或所有条目提供值)。然后,您可以使用随机数生成器生成适当范围内的值并将该值转换回枚举,例如。 g.:

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))
    // ...

但是,如果您向枚举添加更多值,您将密切关注第二个位置是否可能被调整!

【讨论】:

    【解决方案2】:

    只要有类似的东西:

    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) {}
    };
    

    【讨论】:

    • OP 要求随机颜色和随机尺寸。然而,那是相当正交的,可能会提出第二个问题
    • ...或者假设您掷骰子选择redsmall,则满足要求;)
    • @foreknownas_463035818:我确实放弃了随机部分,这似乎是 OP 的第二个问题,应该是 IMO 的第二个问题。
    【解决方案3】:

    您可以像定义类的其他数据成员一样定义枚举类类型的数据成员。

    这是一个演示程序。

    #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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 2017-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多