将枚举类型传递给构造函数

4

我有一个基类Shape和一些派生类,如CircleRectangle等。

这是我的基类。

class Shape {

private:
enum Color {
    Red,
    Orange,
    Yellow,
    Green
};
protected:
int X;
int Y;

// etc...
};

这是我的一个派生类之一。
class Rectangle : public Shape {
private:
int Base;
int Height;
string shapeName;

//etc...
};

这是我调用构造函数的方式:
Rectangle R1(1, 3, 2, 15, "Rectangle 1");

我的构造函数:

Rectangle::Rectangle(int x, int y, int B, int H, const string &Name)
:Shape(x, y)
{
setBase(B);
setHeight(H);
setShapeName(Name);
}

我希望在我的构造函数中添加一个参数,这样我就可以在我的基类中使用枚举颜色传递形状的颜色。我还想将颜色打印为字符串。我不知道如何在构造函数中使用枚举作为参数。

感谢您的任何帮助...


我认为你不应该将枚举类型Color设为私有。 - Xiaotian Pei
你的当前构造函数是什么样子?另外,我怀疑你能否实现目标,因为“enum Shape::Color”是“private”的。 - iammilind
@iammilind 我刚刚添加了我的构造函数。 - Jack in the Box
2个回答

10
首先,您应该将Color设为protected或public。将枚举类型的Color转换为字符串的一种简单方法是使用数组。
class Shape {
public:
    enum Color {
        Red = 0, // although it will also be 0 if you don't write this
        Orange, // this will be 1
        Yellow,
        Green
    };

};

class Rectangle : public Shape {
public:
    Rectangle(int x, int y, int B, int H, Color color);
};

string getColorName(Shape::Color color) {
    string colorName[] = {"Red", "Orange", "Yellow", "Green"};
    return colorName[color];
}

void test() {
    // now you may call like this:
    Rectangle r(1,2,3,4, Shape::Red);
    // get string like this:
    string colorStr = getColorName(Shape::Yellow);
}

你的 void test() 函数对我来说不是很清楚。从你的回答中我明白了你传递 enum Shape::Red 的方式,但我不理解你创建指针对象的方法。而且我希望 string colorStr = colorName[Shape::Yellow]; 可以接收任何颜色,而不仅仅是 Shape::Yellow - Jack in the Box
@Jack in the Box,你可以使用string colorStr = colorName[Shape::Yellow];来表示所有的颜色,例如:string colorStr = colorName[Shape::Red];将会给你返回Red - Ovilia
我能否制作一个通用的程序,适用于所有颜色? - Jack in the Box
更改了答案。我不确定这是否是您所需的。 - Ovilia
1
你必须始终将 getColorName 中的字符串列表与枚举保持同步。因为枚举基本上是一个 int - 你只能将其作为值打印出来。这就是为什么如果要将其打印为与数字不同的东西,则必须维护查找表。 - Tobias Langner

0
< p > enum 的类型名称是它的名称,在类内部,该名称隐式解析为属于该类。在这种情况下,像 Shape(Color color) 这样的构造函数参数将定义一个名为 color 的基类构造函数参数,该参数具有您的 enum Color 类型。

然后,您的派生类可以调用基础构造函数,例如:Rectangle(int x, int y, int width, int height, const char* name, Color color): Shape(color) { ... }

请注意,您还必须更改 enum 的可见性:一个 private: 枚举对子类不可用,因此它必须至少位于基类 Shapeprotected:public: 部分中。

至于 string...请更好地描述您打算做什么。例如,您是否尝试打印颜色的名称或其数字 enum 值?如果是前者,您可以编写一个类似于以下内容的帮助程序:

void printColor (Color color, std::ostream& os)
{
    switch (color)
    {
    case Red:
        os << "Red";
        break;
    . . . // and so on
    }
}

当我创建一个对象时,构造函数会是什么样子?我应该如何传递颜色? Rectangle R1(1, 3, 2, 15, ???, "Rectangle 1"); 我应该在 ??? 中放什么? - Jack in the Box
1
在类外的代码中,枚举值由它们所在的类解析;例如 Shape::RedShape::Yellow,... - Kevin Grant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接