円の実装
CoddyのCジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 45/61。
チャレンジ
簡単Circleを実装してShape Drawerプロジェクトの構築を続けましょう。Shape基底構造体を埋め込み、独自の描画ロジックと面積ロジックを提供する具体的な図形です。
前のレッスンで作成した基盤をもとに、次のファイルを追加してプロジェクトを拡張します。
shape.h:前のレッスンで作成した基底Shapeインターフェースを保持します。DrawFunc型とAreaFunc型の関数ポインタを含めます。circle.h:ここでCircle構造体を定義します。円はShapeを<ここでのfirst member>として埋め込みます(アップキャストでfirst memberルールを利用できます)。さらに、型doubleのradiusフィールドを追加します。radiusを受け取り、値としてCircleをreturnsするconstructor functioncreate_circleをDeclareします。circle.c:ここで円固有の動作をImplementします。draw_circle:Drawing Circle with radius: X.XXをPrintsします(radiusは小数点以下2桁で表示)area_circle:π × radius²をReturnsします(πには3.14159を使用)create_circle:Circleを初期化し、埋め込まれたShapeのfunction pointerをdraw_circleとarea_circleを指すように設定し、radiusを設定して、そのcircleをReturnsします
main.c:すべてを組み合わせます。入力としてradiusの値を読み取り、constructorを使用してcircleをCreateし、埋め込まれたShapeのfunction pointerを通じてdrawとareaの両方をCallします。areaを小数点以下2桁でPrintsします。
プログラムは1つの入力、つまりradiusの値(浮動小数点数)を受け取ります。
入力が5.0の場合の出力例:
Drawing Circle with radius: 5.00
Area: 78.54入力が3.5の場合の出力例:
Drawing Circle with radius: 3.50
Area: 38.48重要なポイントは、CircleがShapeをfirst memberとして含んでいるため、circle.base.drawおよびcircle.base.area(または埋め込むmemberに付けた名前)を通じてfunction pointerにaccessできることです。これらのfunctionsをCallするときは、Shape memberへのpointerを渡します。すべてのheader fileでinclude guardsを使用することを忘れないでください。
自分で試してみよう
#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;
}オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Cオンラインコンパイラ