円の実装
CoddyのCジャーニー「Object Oriented Programming」セクションの一部 — レッスン 45/61。
チャレンジ
簡単基本となる Shape 構造体を埋め込み、独自の描画と面積計算のロジックを提供する具体的な図形である Circle を実装して、Shape Drawer プロジェクトの構築を続けましょう。
前回のレッスンの基礎の上に、以下のファイルを使用してプロジェクトを拡張します。
shape.h: 前回のレッスンのDrawFuncおよびAreaFunc関数ポインタ型を含むベースのShapeインターフェースをそのまま保持します。circle.h: ここでCircle構造体を定義します。円は 最初のメンバ としてShapeを埋め込み(アップキャストのための「最初のメンバのルール」を有効にします)、double型のradiusフィールドを追加します。半径を受け取り、Circleを値で返すコンストラクタ関数create_circleを宣言します。circle.c: ここで円固有の動作を実装します。draw_circle—Drawing Circle with radius: X.XXを出力します(半径は小数点以下2桁で表示)。area_circle— π × radius² を返します(π には3.14159を使用してください)。create_circle—Circleを初期化し、埋め込まれたShapeの関数ポインタがdraw_circleとarea_circleを指すように紐付け、半径を設定して、その円を返します。
main.c: すべてをまとめます。入力として半径の値を読み取り、コンストラクタを使用して円を作成し、埋め込まれたShapeの関数ポインタを介してdrawとareaの両方を呼び出します。面積を小数点以下2桁で出力します。
プログラムは1つの入力、半径の値(浮動小数点数として)を受け取ります。
入力が 5.0 の場合の出力例:
Drawing Circle with radius: 5.00
Area: 78.54入力が 3.5 の場合の出力例:
Drawing Circle with radius: 3.50
Area: 38.48重要なポイントは、Circle が最初のメンバとして Shape を含んでいるため、circle.base.draw や circle.base.area(または埋め込みメンバに付けた名前)を介して関数ポインタにアクセスできることです。これらの関数を呼び出すときは、Shape メンバへのポインタを渡してください。すべてのヘッダーファイルでインクルードガードを使用することを忘れないでください。
自分で試してみよう
#include <stdio.h>
#include "shape.h"
#include "circle.h"
int main() {
double radius;
scanf("%lf", &radius);
// TODO: create_circle を使用して Circle を作成する
// TODO: 埋め込まれた Shape の関数ポインタを介して draw を呼び出す
// TODO: 埋め込まれた Shape の関数ポインタを介して area を呼び出し、
// 小数点以下2桁で表示する: "Area: %.2f\n"
return 0;
}