まとめ:秘密の箱
CoddyのCジャーニー「Object Oriented Programming」セクションの一部 — レッスン 21/61。
チャレンジ
簡単完全なカプセル化を実証する Box モジュールを構築しましょう。作成するボックスには、幅、高さ、奥行きという3つの隠された次元があり、提供する関数を通じてのみアクセスできます。これは、完全な不透明ポインタ(opaque pointer)パターンの実践です!
3つのファイルを作成します:
box.h: 公開インターフェースです。前方宣言のみを使用して不透明なBox型を宣言します。構造体の本体は隠したままにします。以下の関数を宣言してください:create_box— 3つの整数(幅、高さ、奥行き)を受け取り、Box ポインタを返しますdestroy_box— 割り当てられたメモリを解放しますget_volume—const Box *を受け取り、体積(幅 × 高さ × 奥行き)を返しますset_dimensions— Box ポインタと3つの新しい次元の値を受け取り、intを返します(成功した場合は 1、いずれかの次元が負または0の場合は 0)
BOX_Hを使用してください。box.c: 3つの隠されたメンバint width、int height、int depthを持つ実際のstruct Boxを定義します。4つの関数すべてを実装してください。コンストラクタはボックスを割り当てて初期化する必要があります。set_dimensions関数は、変更を適用する前に3つの値すべてが正(0より大きい)であることを検証しなければなりません。いずれかの値が検証に失敗した場合は、更新全体を拒否して 0 を返します。main.c: ボックスを作成し、その体積を確認し、次元の変更(有効なものと無効なものの両方)を試み、適切にクリーンアップすることで、カプセル化された Box を実証します。
5つの入力を受け取ります:初期の幅、初期の高さ、初期の奥行き、続いて設定を試みる3つの新しい次元(無効な値が含まれる場合があります)です。
メインファイルで、初期の次元で Box を作成し、その体積を出力します。次に、新しい次元の設定を試み、更新が成功したかどうかと、結果として得られる体積を出力します。最後に、ボックスを解放し、クリーンアップを確認します。
出力は以下の形式で表示してください:
Volume: {volume}
Set: {0 or 1}
Volume: {volume}
Destroyed例えば、入力が 2, 3, 4, 5, 5, 5 の場合、出力は以下のようになります:
Volume: 24
Set: 1
Volume: 125
Destroyed入力が 2, 3, 4, -1, 5, 5 の場合、出力は以下のようになります:
Volume: 24
Set: 0
Volume: 24
Destroyedset_dimensions での検証が、どのようにボックスを無効な状態から保護しているかに注目してください。次元はインターフェースの背後に完全に隠されているため、外部のコードがルールをバイパスすることはできません。
自分で試してみよう
#include <stdio.h>
#include "box.h"
int main() {
// 初期の寸法を読み込む
int width, height, depth;
scanf("%d", &width);
scanf("%d", &height);
scanf("%d", &depth);
// 試行する新しい寸法を読み込む
int new_w, new_h, new_d;
scanf("%d", &new_w);
scanf("%d", &new_h);
scanf("%d", &new_d);
// TODO: 初期の寸法で Box を作成する
// TODO: 初期の体積を "Volume: {volume}" の形式で出力する
// TODO: 新しい寸法の設定を試行し、その結果を保存する
// TODO: 設定が成功したかどうかを "Set: {0 or 1}" の形式で出力する
// TODO: 結果の体積を "Volume: {volume}" の形式で出力する
// TODO: box を破棄し、"Destroyed" と出力する
return 0;
}