長方形の実装
CoddyのCジャーニー「Object Oriented Programming」セクションの一部 — レッスン 46/61。
チャレンジ
簡単Circleで行ったのと同様に、ベースとなる Shape 構造体を埋め込んだもう一つの具体的な図形である Rectangle を実装して、Shape Drawerプロジェクトの構築を続けましょう。
既存のプロジェクトをベースに、以下のファイルに長方形(rectangle)の機能を追加します:
shape.h: 前のレッスンで作成したDrawFuncおよびAreaFunc関数ポインタ型を持つベースのShapeインターフェースをそのまま保持します。circle.hおよびcircle.c: 前のレッスンの Circle の実装をそのまま保持します。rectangle.h: ここでRectangle構造体を定義します。長方形は 最初のメンバ としてShapeを埋め込み、widthとheightフィールド(どちらもdouble)を追加します。幅と高さのパラメータを受け取り、Rectangleを値で返すコンストラクタ関数create_rectangleを宣言します。rectangle.c: 長方形固有の動作を実装します:draw_rectangle—Drawing Rectangle with width: X.XX and height: X.XXと出力します(両方の値は小数点以下2桁で表示)。area_rectangle— 幅 × 高さを返します。create_rectangle—Rectangleを初期化し、埋め込まれたShapeの関数ポインタを長方形用の関数に紐付け、寸法を設定して、その長方形を返します。
main.c: 同じインターフェースを通じて両方の図形が動作することを実証します。長方形の幅と高さの2つの入力を読み取ります。コンストラクタを使用して長方形を作成し、埋め込まれたShapeの関数ポインタを介してdrawとareaの両方を呼び出します。面積を小数点以下2桁で出力します。
プログラムは、width(幅)と height(高さ)の2つの入力(浮動小数点数)を受け取ります。
入力が 4.0 と 3.0 の場合の出力例:
Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00入力が 7.5 と 2.5 の場合の出力例:
Drawing Rectangle with width: 7.50 and height: 2.50
Area: 18.75Circleと同様に、Rectangleは Shape を最初のメンバとして埋め込んでいるため、埋め込まれたメンバを介して関数ポインタにアクセスできます。この一貫したパターンがポリモーフィズムを可能にします。つまり、どちらの図形も Shape インターフェースを通じて一様に扱うことができます。すべてのヘッダーファイルでインクルードガードを使用することを忘れないでください。
自分で試してみよう
#include <stdio.h>
#include "shape.h"
#include "rectangle.h"
int main() {
double width, height;
scanf("%lf", &width);
scanf("%lf", &height);
// TODO: create_rectangle(width, height) を使用して長方形を作成する
// TODO: 埋め込まれた Shape の関数ポインタを介して draw を呼び出す
// TODO: 埋め込まれた Shape の関数ポインタを介して area を呼び出す
// TODO: 面積を小数点以下2桁で表示する: "Area: %.2f\n"
return 0;
}