Menu
Coddy logo textTech

まとめ:秘密の箱

CoddyのCジャーニー「Object Oriented Programming」セクションの一部 — レッスン 21/61。

challenge icon

チャレンジ

簡単

完全なカプセル化を実証する Box モジュールを構築しましょう。作成するボックスには、幅、高さ、奥行きという3つの隠された次元があり、提供する関数を通じてのみアクセスできます。これは、完全な不透明ポインタ(opaque pointer)パターンの実践です!

3つのファイルを作成します:

  • box.h: 公開インターフェースです。前方宣言のみを使用して不透明な Box 型を宣言します。構造体の本体は隠したままにします。以下の関数を宣言してください:
    • create_box — 3つの整数(幅、高さ、奥行き)を受け取り、Box ポインタを返します
    • destroy_box — 割り当てられたメモリを解放します
    • get_volumeconst Box * を受け取り、体積(幅 × 高さ × 奥行き)を返します
    • set_dimensions — Box ポインタと3つの新しい次元の値を受け取り、int を返します(成功した場合は 1、いずれかの次元が負または0の場合は 0)
    インクルードガードにはシンボル BOX_H を使用してください。
  • box.c: 3つの隠されたメンバ int widthint heightint 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
Destroyed

set_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;
}

Object Oriented Programmingのすべてのレッスン