对于我正在处理的作业,我必须创建枚举类并使用它们来定义另一个类的成员。枚举类如下:
enum class Ball_colors {
red,
blue,
yellow,
green
};
enum class Ball_sizes {
small,
medium,
large
};
称为“球”的类表示某种颜色和大小的球。 ball的默认构造函数应该随机选择颜色和大小,并且我应该使用参数化的构造函数,以及获取大小或颜色的函数,但是我绝对不知道如何使用枚举类,尤其是在其他类中。我什至不确定我是否正确定义了类。如何在另一个类中使用枚举类,如何从枚举类中随机选择某些内容?
答案 0 :(得分: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参数:
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))
// ...
但是如果您向枚举添加更多值,您将留意第二个位置是否有可能被改编!
答案 1 :(得分:0)
就像这样:
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) {}
};
答案 2 :(得分:0)
您可以使用与定义类的其他数据成员相同的方式来定义枚举类类型的类的数据成员。
这是一个演示程序。
#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.