4

基本クラスと、 などのShape他の派生クラスがあります。CircleRectangle

これは私の基本クラスです

class Shape {

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

// etc...
};

これは私の派生クラスの1つです

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基本クラスで使用して形状の色を渡すことができるように、コンストラクターに 1 つの引数を追加したいと考えています。どうやってやるの?また、色を として印刷したいと考えていますstringenumコンストラクターで引数として使用する方法がわかりません。

どんな助けでも大歓迎です...

4

2 に答える 2

9

まず、Color を保護または公開する必要があります。Color を列挙型から文字列に変換する簡単な方法の 1 つは、配列を使用することです。

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);
}
于 2012-07-24T03:41:11.890 に答える
0

an の型名enumはその名前であり、クラス内では名前はクラスに属するように暗黙的に解決されます。この場合、次のようなコンストラクター引数は、ユーザーの型を持つShape(Color color)名前付きの基本クラス コンストラクター パラメーターを定義します。colorenum Color

その後、派生クラスは基本コンストラクターを呼び出すことができますRectangle(int x, int y, int width, int height, const char* name, Color color): Shape(color) { ... }

の可視性も変更する必要があることに注意してくださいenumprivate:列挙型はサブクラスでは使用できないため、少なくとも基本クラスのprotected:またはpublic:セクションにある必要がありShapeます。

限りstring...あなたが何をしようとしているのかをよりよく説明してください. たとえば、色の名前や数値を印刷しようとしていenumますか? 前者の場合、次のようなヘルパー メソッドを記述できます。

void printColor (Color color, std::ostream& os)
{
    switch (color)
    {
    case Red:
        os << "Red";
        break;
    . . . // and so on
    }
}
于 2012-07-24T03:26:43.770 に答える