好吧,您使用枚举类的名称就像使用任何其他普通类的名称一样,例如。 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))
// ...
但是,如果您向枚举添加更多值,您将密切关注第二个位置是否可能被调整!