4

さまざまな形状のオブジェクトを描画できるクラスの設計に問題があります。

  1. 形状は基本クラスです
  2. Triangle、Square、Rectangle は class から派生したShapeクラスです。
  3. 派生オブジェクトをvector<Shape*> ShapeCollection格納するTriangle,Square, Rectangle
  4. ベクターからオブジェクトを選択したら、そのオブジェクトを画面に描画する必要があります。

この時点で、単一の 'Drawing' クラスが 'Shape' クラスのオブジェクトを消費して描画を行うため、クラスの設計がどうあるべきかで行き詰まっています。ベクターには同じ基本クラスの異なるオブジェクトが含まれるためShape。ベクトルからオブジェクトを取得するスレッドがあり、オブジェクトを取得したら、それを適切に描画できる必要があります。

だから多かれ少なかれ以下は私が言うことです

class Drawing
{
public:
   void Draw(Shape* shape, string objectName)
   {
       // Now draw the object.
       // But I need to know which Object I am drawing or use
       // switch statements to identify somehow which object I have
       // And then draw. I know this is very BAD!!!
       // e.g.
        switch(objectName)
        {
          case "rectangle":
                DrawRectangle((Rectangle*) shape)
          break;
          //Rest of cases follow
        }
   }
}

ここで、描画を行う DrawSquare、DrawTriangle 関数を使用します。

これは解決済みのはずです。この switch ステートメントはすべて何らかの形で取り除かなければならないため、これを行うためのより良い方法が必要です。

どんなガイダンスも大歓迎です。

ありがとう


@Adrian と @Jerry は仮想関数を使用することを提案しましたが、私はそれを考えましたが、自分の Drawing を基本クラスから遠ざける必要がありますShape

4

2 に答える 2