不透明なポインタの概念
CoddyのCジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 17/61。
これまで、ヘッダーファイルでstructを定義すると、そのヘッダーをインクルードする誰もが、すべてのメンバーを確認し、直接アクセスできます。これはカプセル化、つまり内部の詳細を外部のコードから隠す原則に反します。
Cには、これを解決するためのopaque pointersと呼ばれる強力な技法があります。考え方は単純です。ヘッダーでstructが存在することを宣言しますが、その中身は明らかにしません。これは不完全型を使って行います。
// wallet.h
typedef struct Wallet Wallet; // 宣言のみ - 本体なし!
Wallet *create_wallet(int initial_balance);
void free_wallet(Wallet *w);
curly braces がないことに注目してください。Wallet に何が含まれるかは決して定義していません。コンパイラーはその型が存在することは知っていますが、そのサイズやメンバーについては知りません。つまり、このヘッダーを含むコードは、Wallet そのものを直接扱うことは決してできず、ポインター のみを扱えます。
なぜこれが重要なのでしょうか?実際の struct 定義は .c ファイル内に隠されているため、あなたのヘッダーを使用するコードでは w->balance や sizeof(Wallet) を記述できません。提供した関数を使う必要があります。データへのすべてのアクセスをあなたが制御でき、ヘッダーに依存するコードを壊すことなく、後から内部構造を変更できます。
次のレッスンでは、ソースファイル内で実際のstruct bodyを定義し、opaque pointerパターンを完成させる練習をします。
自分で試してみよう
このレッスンにはコードチャレンジは含まれていません。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Cオンラインコンパイラ