図形コンテナ
CoddyのCジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 48/61。
チャレンジ
簡単Shape Drawer プロジェクトをいよいよ完成させましょう!Circles と Rectangles の混在したコレクションを保持する shape コンテナを作成し、その中を反復処理して合計面積を計算します。これにより、ポリモーフィズムの真の力を実証します。
これまでに作成したすべてのものを基に、完成したプロジェクトには次のものが含まれます。
shape.hとshape.c:基底 Shape インターフェースとprocess_shape関数。circle.hとcircle.c:コンストラクターと面積計算を備えた Circle の実装。rectangle.hとrectangle.c:コンストラクターと面積計算を備えた Rectangle の実装。main.c:ここで処理の核心が行われます。任意の shape 型を保持できるShape*ポインターの array を作成します。Circles と Rectangles を混在させて格納し、その後 array をループして、すべての shapes の合計面積を計算して表示します。
プログラムには次の入力が与えられます。
- 作成する shapes の数
- 各 shape について:type indicator(circle には
c、rectangle にはr)と、それに続く dimensions
コンテナ内の各 shape について、Shape* ポインターを通じて自分で draw と area を呼び出し(shapes[i]->draw(shapes[i])、shapes[i]->area(shapes[i]))、その面積を累計に加えます。ここでは shape.c の process_shape を使用しないでください。これは各 shape について余分な Area: 行を出力しますが、期待される出力には含まれていないためです。すべての shapes の処理後、合計面積を小数点以下 2 桁で、Total Area: X.XX の形式で出力します。
入力が 3、続いて c 5.0、r 4.0 3.0、c 2.0 の場合の例:
Drawing Circle with radius: 5.00
Drawing Rectangle with width: 4.00 and height: 3.00
Drawing Circle with radius: 2.00
Total Area: 103.11入力が 2、続いて r 6.0 4.0、r 3.0 2.0 の場合の例:
Drawing Rectangle with width: 6.00 and height: 4.00
Drawing Rectangle with width: 3.00 and height: 2.00
Total Area: 30.00重要な点は、array が Shape* ポインターを格納していることです。各要素が実際には Circle なのか Rectangle なのかを気にする必要はありません。反復処理を行い、各ポインターを通じて draw と area を呼び出すと、それぞれの shape がどのように構築されたかに基づいて、正しい実装が自動的に実行されます。これがポリモーフィズムの実際の動作です。1 つのループ、1 つのインターフェース、複数の振る舞いです。
具体的な shapes に埋め込まれた Shape メンバーへのポインターを array に格納する必要があることを忘れないでください。circle の面積計算には π として 3.14159 を使用します。
重要:shape type character の読み取り: scanf("%d", &n) で shapes の数を読み取った後、type character を読み取る各 subsequent call では、input buffer に残った改行をスキップする必要があります。これを行うには、format string の先頭にスペースを使用します。
scanf(" %c", &type); // note the space before %c先頭のスペースがない場合、scanf は意図した c や r ではなく、前の入力から残った改行文字を読み取ります。その結果、shape type のチェックが黙って失敗し、出力が生成されません。
自分で試してみよう
#include <stdio.h>
#include <stdlib.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"
int main() {
// TODO: 図形の数を読み取る
// TODO: circles、rectangles、および Shape* ポインタ用の配列を割り当てる
// TODO: 各図形をループし、種類と寸法を読み取り、
// 図形を作成し、その基底へのポインタを shapes 配列に格納する
// TODO: shapes 配列をループし、shapes[i]->draw(...) と
// shapes[i]->area(...) を直接呼び出して合計面積を累積する
// (process_shape を呼び出さないこと: 余分な Area 行を出力する)
// TODO: 合計面積を次の形式で出力する: Total Area: X.XX
// TODO: 割り当てたメモリを解放する
return 0;
}
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Cオンラインコンパイラ