将枚举传递给构造函数

时间:2012-07-24 03:12:44

标签: c++ constructor enums

我有一个基类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);
}

我想在构造函数中添加一个参数,这样我就可以在我的基类中使用enum Color传递形状的颜色。我怎样才能做到这一点?我还想将颜色打印为string。我不知道如何在构造函数中使用enum作为参数。

感谢任何帮助...

2 个答案:

答案 0 :(得分:8)

首先,您应该使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);
}

答案 1 :(得分:0)

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:枚举,因此它必须至少位于protected:或{{1基类public:的一部分。

Shape而言......请更好地描述您打算做什么。例如,您是否尝试打印颜色名称或其数字string值?如果是前者,你可以编写一个这样的辅助方法:

enum