ヘルパーメソッド
CoddyのCジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 10/61。
ここまで、構造体データを変更する関数(player_take_damageなど)と、単にデータを表示する関数を見てきました。しかし、もう1つ重要なカテゴリがあります。それは、何も変更せずに構造体メンバーから派生値を計算する関数です。
幅と高さを格納する Rectangle 構造体について考えてみましょう。面積は格納されず、必要に応じて計算されます。
typedef struct {
double width;
double height;
} Rectangle;
double rectangle_area(const Rectangle *self) {
return self->width * self->height;
}
double rectangle_perimeter(const Rectangle *self) {
return 2 * (self->width + self->height);
}
これらはhelper methodsです。構造体の既存のデータを受け取り、新しい値を生成します。読み取りのみを行い、書き込みは決して行わないため、constポインターを使用していることに注目してください。計算された結果は構造体に保存されるのではなく、返されます。
Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box)); // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0
このパターンにより、構造体を簡潔に保てます。必要不可欠なデータだけを保存し、それ以外は必要に応じて計算します。また、派生値が常に現在の状態と一致することも保証します。
チャレンジ
簡単保存されたデータから派生値を計算するCircleモジュールを作成しましょう。構造体のメンバーを変更せずに結果を計算するhelper methods、つまりfunctionの記述を練習します。
3つのファイルを作成します:
circle.h:単一のdouble radiusメンバーを持つCircle構造体をDeclareします。また、2つのhelpermethodsもDeclareします:circle_area:Circleへのconstポインターを受け取り、面積を返しますcircle_circumference:Circleへのconstポインターを受け取り、円周を返します
CIRCLE_Hを使ってインクルードガードを使用します。circle.c:両方のhelpermethodsをImplementします。計算には、円周率の値として3.14159を使用します。面積の公式はpi * radius * radiusで、円周の公式は2 * pi * radiusです。どちらのfunctionもradiusを読み取るonlyものとし、決して変更してはいけません。main.c:CircleをCreateし、helpermethodsを使ってそのプロパティを計算し、表示します。
入力は1つです:円のradius(double型)。
mainファイルで、与えられたradiusを使ってCircleを初期化し、その後helper methodsを使って面積と円周を計算してPrintします。
結果を次の形式でPrintします:
Area: {area}
Circumference: {circumference}両方の値に%.2fを使用して、小数点以下2桁まで表示します。
たとえば、radiusが5.0の場合、出力は次のようになります:
Area: 78.54
Circumference: 31.42自分で試してみよう
#include <stdio.h>
#include "circle.h"
int main() {
double radius;
scanf("%lf", &radius);
// TODO: 与えられた半径で Circle 構造体を作成する
// TODO: Use circle_area and circle_circumference helper methods
// 結果を計算して出力する
// 出力形式:
// printf("Area: %.2f\n", ...);
// printf("Circumference: %.2f\n", ...);
return 0;
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Cオンラインコンパイラ