まとめ:図形計算機
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 63/104。
チャレンジ
簡単ポリモーフィズムについて学んだすべてを統合した、図形計算機を作成しましょう。抽象クラス Shape を作成し、共通のインターフェースを通じてアクセス可能な、面積と周囲の長さを計算する具体的な図形を実装します。
コードは以下の4つのファイルに分けて構成します:
Shape.h: すべての図形の設計図となる抽象クラスShapeを定義します。ベースクラスには以下を含める必要があります:- 図形を識別するための protected な
std::string nameメンバ - 名前を初期化するコンストラクタ
doubleを返す純粋仮想関数area()およびperimeter()- 図形の名前を返す
getName()メソッド - 仮想デストラクタ
- 図形を識別するための protected な
Circle.h:Shapeを継承するCircleクラスを実装します:- private な
double radiusメンバ - 半径を受け取るコンストラクタ(名前を
"Circle"に設定します) - 公式 3.14159 * radius * radius を使用して
area()を実装 - 公式 2 * 3.14159 * radius を使用して
perimeter()を実装
- private な
Rectangle.h:Shapeを継承するRectangleクラスを実装します:- private な
double widthおよびdouble heightメンバ - 幅と高さを受け取るコンストラクタ(名前を
"Rectangle"に設定します) - width * height として
area()を実装 - 2 * (width + height) として
perimeter()を実装
- private な
main.cpp: 4つの入力(それぞれ別の行)を読み取ります:- 円の半径 (double)
- 長方形の幅 (double)
- 長方形の高さ (double)
- 2つ目の円の半径 (double)
これら3つの図形を動的に作成し、
Shape*ポインタの配列に格納します。配列をループで回し、各図形について以下の形式で情報を出力します:<name>: Area: <area> Perimeter: <perimeter>各図形の間に空行を出力してください。終了時には、動的に割り当てたオブジェクトをクリーンアップしてください。
例えば、入力が 5、4、6、3 の場合:
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;
}
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタ引数付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ詳解Rule of Three / Five / Zeroまとめ - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () 演算子のオーバーロード型変換演算子まとめ:Matrix クラス