長方形の実装
CoddyのCジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 46/61。
チャレンジ
簡単Rectangleを実装して、Shape Drawerプロジェクトの構築を続けましょう。これは、Circleで行ったものと同様に、基底のShape構造体を埋め込む、もう1つの具象図形です。
既存のプロジェクトを基に、次のファイルにrectangleの機能を追加します。
shape.h: 前のレッスンで作成した、DrawFuncおよびAreaFuncの関数ポインタ型を持つ基底Shapeインターフェースを維持します。circle.hおよびcircle.c: 前のレッスンで作成したCircleの実装を維持します。rectangle.h: ここでRectangle構造体を定義します。rectangleはShapeをfirst memberとして埋め込み、widthおよびheightフィールド(どちらもdouble)を追加します。widthとheightのパラメーターを受け取り、値としてRectangleを返すconstructor関数create_rectangleをDeclareします。rectangle.c: rectangle固有の動作をImplementします。draw_rectangle:Drawing Rectangle with width: X.XX and height: X.XXをPrintします(どちらの値も小数点以下2桁で表示)area_rectangle: width × heightを返しますcreate_rectangle:Rectangleを初期化し、埋め込まれたShapeの関数ポインタをrectangleの関数に接続し、寸法を設定して、rectangleを返します
main.c: 同じインターフェースを通じて両方の図形が動作することを示します。2つの入力、つまりrectangleのwidthとheightを読み取ります。constructorを使用してrectangleをCreateし、埋め込まれたShapeの関数ポインタを通じてdrawとareaの両方をCallします。areaを小数点以下2桁でPrintします。
プログラムは2つの入力、つまりwidthとheightの値(浮動小数点数)を受け取ります。
入力が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をfirst memberとして埋め込むため、埋め込まれたmemberを通じて関数ポインタにアクセスできます。この一貫したパターンによってポリモーフィズムが可能になります。つまり、両方の図形をShapeインターフェースを通じて統一的に扱えます。すべてのヘッダーファイルでinclude guardを使用することを忘れないでください。
自分で試してみよう
#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;
}オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Cオンラインコンパイラ