Menu
Coddy logo textTech

まとめ:図形計算機

CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 63/104。

challenge icon

チャレンジ

簡単

ポリモーフィズムについて学んだすべてを統合した、図形計算機を作成しましょう。抽象クラス Shape を作成し、共通のインターフェースを通じてアクセス可能な、面積と周囲の長さを計算する具体的な図形を実装します。

コードは以下の4つのファイルに分けて構成します:

  • Shape.h: すべての図形の設計図となる抽象クラス Shape を定義します。ベースクラスには以下を含める必要があります:
    • 図形を識別するための protected な std::string name メンバ
    • 名前を初期化するコンストラクタ
    • double を返す純粋仮想関数 area() および perimeter()
    • 図形の名前を返す getName() メソッド
    • 仮想デストラクタ
  • Circle.h: Shape を継承する Circle クラスを実装します:
    • private な double radius メンバ
    • 半径を受け取るコンストラクタ(名前を "Circle" に設定します)
    • 公式 3.14159 * radius * radius を使用して area() を実装
    • 公式 2 * 3.14159 * radius を使用して perimeter() を実装
  • Rectangle.h: Shape を継承する Rectangle クラスを実装します:
    • private な double width および double height メンバ
    • 幅と高さを受け取るコンストラクタ(名前を "Rectangle" に設定します)
    • width * height として area() を実装
    • 2 * (width + height) として perimeter() を実装
  • main.cpp: 4つの入力(それぞれ別の行)を読み取ります:
    1. 円の半径 (double)
    2. 長方形の幅 (double)
    3. 長方形の高さ (double)
    4. 2つ目の円の半径 (double)

    これら3つの図形を動的に作成し、Shape* ポインタの配列に格納します。配列をループで回し、各図形について以下の形式で情報を出力します:

    <name>:
      Area: <area>
      Perimeter: <perimeter>

    各図形の間に空行を出力してください。終了時には、動的に割り当てたオブジェクトをクリーンアップしてください。

例えば、入力が 5463 の場合:

Circle:
  Area: 78.5397
  Perimeter: 31.4159

Rectangle:
  Area: 24
  Perimeter: 20

Circle:
  Area: 28.2743
  Perimeter: 18.8495

同じ printShapeInfo のロジックがいかなる図形タイプに対しても機能することに注目してください。これがポリモーフィズムの力です。コードは Shape インターフェースを通じて円と長方形を同一に処理し、各図形は自身の測定値を計算する方法を知っています。正しい関数シグネチャを保証するために、すべてのオーバーライドされたメソッドに override キーワードを使用してください。

自分で試してみよう

#include <iostream>
#include "Shape.h"
#include "Circle.h"
#include "Rectangle.h"

using namespace std;

int main() {
    // 入力を読み込む
    double circleRadius1, rectWidth, rectHeight, circleRadius2;
    cin >> circleRadius1;
    cin >> rectWidth;
    cin >> rectHeight;
    cin >> circleRadius2;

    // TODO: 3つの要素を持つ Shape* ポインタの配列を作成する
    // Shape* shapes[3];

    // TODO: 図形を動的に作成し、配列に格納する
    // shapes[0] = new Circle(...);
    // shapes[1] = new Rectangle(...);
    // shapes[2] = new Circle(...);

    // TODO: 配列をループして、各図形の情報を表示する
    // フォーマット:
    // <name>:
    //   Area: <area>
    //   Perimeter: <perimeter>
    // (図形の間に空行を入れるが、最後の図形の後には入れない)

    // TODO: 動的に割り当てられたオブジェクトをクリーンアップする
    // delete shapes[i];

    return 0;
}

オブジェクト指向プログラミングのすべてのレッスン