Menu
Coddy logo textTech

不透明なポインタの概念

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->balancesizeof(Wallet) を記述できません。提供した関数を使う必要があります。データへのすべてのアクセスをあなたが制御でき、ヘッダーに依存するコードを壊すことなく、後から内部構造を変更できます。

次のレッスンでは、ソースファイル内で実際のstruct bodyを定義し、opaque pointerパターンを完成させる練習をします。

自分で試してみよう

このレッスンにはコードチャレンジは含まれていません。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Cオンラインコンパイラ