Menu
Coddy logo textTech

復習 - 図形計算機

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

challenge icon

チャレンジ

簡単

ポリモーフィズムについて学んだことをすべて結集した図形計算機を作ってみましょう。抽象 Shape class を作成し、面積と周長を計算する具象図形を Implement します。これらには共通のインターフェースからアクセスできます。

コードを4つのファイルに整理します。

  • Shape.h:すべての図形の設計図となる抽象 Shape class を define します。基底 class には次の要素を含めます。
    • 図形を識別する protected std::string name member
    • name を初期化する constructor
    • double を返す pure virtual method area()perimeter()
    • 図形の name を返す getName() method
    • virtual destructor
  • Circle.hShape を継承する Circle class を Implement します。
    • private double radius member
    • radius を受け取る constructor(name を "Circle" に設定)
    • 次の formula を使用して area() を Implement:3.14159 * radius * radius
    • 次の式を使用して perimeter() を Implement:2 * 3.14159 * radius
  • Rectangle.hShape を継承する Rectangle class を Implement します。
    • private double width および double height member
    • width と height を受け取る constructor(name を "Rectangle" に設定)
    • width * height として area() を Implement
    • 2 * (width + height) として perimeter() を Implement
  • main.cpp:4つの入力を読み取ります(それぞれ別の行に入力)。
    1. Circle の radius(double)
    2. Rectangle の width(double)
    3. Rectangle の height(double)
    4. 2つ目の circle の radius(double)

    3つの図形をすべて dynamically に Create し、Shape* pointers の array に格納します。array を Loop し、各図形の情報を次の形式で print します。

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

    各図形の間に blank line を print します。処理が終了したら、dynamically に allocated した objects を Clean します。

たとえば、入力が 5463 の場合:

Circle:
  Area: 78.5397
  Perimeter: 31.4159

Rectangle:
  Area: 24
  Perimeter: 20

Circle:
  Area: 28.2743
  Perimeter: 18.8495

同じ printShapeInfo logic が、どのような図形 type に対しても機能することに注目してください。これが polymorphism の力です。コードは Shape interface を通じて、circle と rectangle を同じように処理し、各図形は自身の測定値を計算する方法を理解しています。正しい function signatures を確実に使用するため、override されたすべての method に override keyword を使用してください。

自分で試してみよう

#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: Shape* ポインタの配列を3要素で作成する
    // 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;
}

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

自分で練習してみよう: C++オンラインコンパイラ