口座の実装
CoddyのCジャーニー「Object Oriented Programming」セクションの一部 — レッスン 23/61。
チャレンジ
簡単さあ、銀行口座(Bank Account)に命を吹き込む時が来ました!すでに account.h でパブリックインターフェースを作成しましたが、次はそれを機能させるための隠された内部構造を実装します。
これまでの作業をベースに、秘密の構造体定義と実際の関数実装を含むソースファイルを追加します。これこそがカプセル化の真髄です。構造体の本体は .c ファイル内にのみ存在し、ライブラリを使用する人からは完全に見えなくなります。
3つのファイルを扱います:
account.h: 不透明なAccount型の宣言と、create_accountおよびdestroy_accountの関数プロトタイプが含まれる既存のヘッダーです。ACCOUNT_Hによるインクルードガードを維持してください。account.c: ここで魔法が起こります。2つの隠しメンバを持つ実際のstruct Accountを定義します:int id(口座識別子)とdouble balance(新規口座の場合は 0.0 から開始)。メモリを割り当て、パラメータから ID を設定し、残高をゼロに初期化するコンストラクタを実装してください。また、メモリを適切に解放するデストラクタを実装してください。main.c: 口座を作成し、正しく動作することを確認して実装をテストします。構造体のメンバは隠されているため、中を覗き見ることはできませんが、ライフサイクルが正しく機能しているかを確認できます。
1つの入力を受け取ります:新しい口座に割り当てる account ID(整数)です。
メインファイルで、提供された ID を使用して口座を作成し、その ID を示す確認メッセージを表示した後、口座を破棄してクリーンアップを確認してください。
出力は以下の形式で表示してください:
Account 1001 created
Account destroyedここで、1001 は入力として受け取った実際の ID に置き換えられます。
注意:main.c は account->id や account->balance に直接アクセスすることはできません。これらのメンバは account.c の内部に完全に隠されています。今回は、出力メッセージに入力された ID をそのまま使用します。今後のレッスンでは、隠されたデータを適切に取得するためのゲッター関数を追加していきます。
自分で試してみよう
#include <stdio.h>
#include "account.h"
int main() {
int account_id;
// TODO: 入力から account_id を読み込む
scanf("%d", &account_id);
// TODO: create_account() を使用してアカウントを作成し、"Account <id> created" と出力する
// TODO: destroy_account() を使用してアカウントを破棄し、"Account destroyed" と出力する
return 0;
}