2012-07-24 134 views
3

我有一个基类Shape和一些其他派生类,如Circle,Rectangle等。将enum传递给构造函数

这是我的基类

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作为参数。

任何帮助表示赞赏...

+0

我认为你不应该使枚举颜色私人。 – 2012-07-24 03:16:53

+0

你目前的构造函数是怎样的?我也怀疑你可以实现这个目标,因为enum Shape :: Color是private。 – iammilind 2012-07-24 03:17:26

+0

@iammilind我刚刚添加了我的构造函数 – 2012-07-24 03:24:50

回答

8

首先,您应该使Color受保护或公开。一种简单的方法可以将Color从enum转换为string,即使用数组。

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); 
} 
+0

你的'void test()'函数对我来说不是很清楚。答案是你通过'enum'' Shape :: Red'的方式,我不明白你创建一个指针对象的方式。我想'string colorStr = colorName [Shape :: Yellow];'接收任何颜色,不仅仅是'Shape :: Yellow' – 2012-07-24 04:25:05

+0

@Jack in the Box你可以使用'string colorStr = colorName [Shape :: Yellow]; '表示所有颜色,如:'string colorStr = colorName [Shape :: Red];'会给你'红色'。 – Ovilia 2012-07-24 05:10:36

+0

我可以制作一种可用于所有颜色的普通照片吗? – 2012-07-24 05:31:29

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:枚举将不会提供给子类,因此必须至少在基类Shapeprotected:public:部分。

只要string ...请更好地描述你打算做什么。例如,您是否尝试打印颜色名称或其数值enum值?如果是前者,您可以编写如下帮助程序:

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

当我创建一个对象时,构造函数的外观如何? 'Rectangle R1(1,3,2,15,???,“Rectangle 1”);'我应该输入什么'???' – 2012-07-24 04:38:08

+1

在类外的代码中,'enum'值由它们所在的类来解析;例如'Shape :: Red','Shape :: Yellow',... – 2012-07-24 04:45:45

相关问题