復習 - 図形計算機
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 63/104。
チャレンジ
簡単ポリモーフィズムについて学んだことをすべて結集した図形計算機を作ってみましょう。抽象 Shape class を作成し、面積と周長を計算する具象図形を Implement します。これらには共通のインターフェースからアクセスできます。
コードを4つのファイルに整理します。
Shape.h:すべての図形の設計図となる抽象Shapeclass を define します。基底 class には次の要素を含めます。- 図形を識別する protected
std::string namemember - name を初期化する constructor
doubleを返す pure virtual methodarea()とperimeter()- 図形の name を返す
getName()method - virtual destructor
- 図形を識別する protected
Circle.h:Shapeを継承するCircleclass を Implement します。- private
double radiusmember - radius を受け取る constructor(name を
"Circle"に設定) - 次の formula を使用して
area()を Implement:3.14159 * radius * radius - 次の式を使用して
perimeter()を Implement:2 * 3.14159 * radius
- private
Rectangle.h:Shapeを継承するRectangleclass を Implement します。- private
double widthおよびdouble heightmember - width と height を受け取る constructor(name を
"Rectangle"に設定) - width * height として
area()を Implement - 2 * (width + height) として
perimeter()を Implement
- private
main.cpp:4つの入力を読み取ります(それぞれ別の行に入力)。- Circle の radius(double)
- Rectangle の width(double)
- Rectangle の height(double)
- 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 します。
たとえば、入力が 5、4、6、3 の場合:
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;
}
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタパラメータ付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ徹底解説Rule of Three / Five / Zero復習 - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () の演算子オーバーロード型変換演算子復習 - Matrixクラス自分で練習してみよう: C++オンラインコンパイラ