next up previous
Next: 各クラスの概要 Up: Cによるオブジェクト指向の記述 Previous: クラスの定義

Subsections

クラスの利用

C言語はオブジェクト指向言語として設計されていないため、言語の機能として 継承やカプセル化の機構を持たない。そこで、利用する側からの工夫や、 オブジェクト指向的にクラスを利用するためのルールを制定することで、 メンテナンス性の高いコードの維持に努めるようにする。

メンバへ変数のアクセス

C言語による簡易なオブジェクト指向記述においては、各クラスのメンバ 変数のアクセスコントロールを実現することはできない。したがって、 言語のセマンティクスによれば各クラスのメンバ変数は全て公開メンバである。

上記のC言語の制約を逃れ、少なくともある程度のアクセスコントロールを 意図するためにも、メンバ変数への直接のアクセスは可能な限り避け、 公開メンバ変数に対してのみアクセサを用意することを心掛けることが 望ましい。

上位クラスのメンバへのアクセス

例えば、MalibRingBuf クラスは、親クラス MalibBuffer の さらに親クラスである MalibHolder の定義する メンバ変数 size を持つ。ある MalibRingBuf のインスタンス rbuf からその size へアクセスする方法には、 次の二通りのパターンがある。
MalibRingBuf* rbuf;
gint size;

/* pattern 1 */
size = rbuf->super.super.size;

/* pattern 2 */
size = ((MalibHolder*)rbuf)->size;

本ライブラリの実装においては、 メンバ変数 sizeMalibHolder で定義されていることが 明示的に分かるとの利点を重視し、後者の方法による記述を採用 する。

メンバ関数の呼び出し

それぞれのメンバ関数の呼び出しにおいては、定義の項で述べたとおり、 第一引数にはそのメンバ関数を持つクラスのオブジェクト(正確には そのオブジェクトへのポインタ)を置く。その際、オブジェクト指向言語では ないため暗黙の型変換は行なわれない。したがって利用者は、 呼び出そうとする関数がたとえ上位クラスで定義されているメンバ関数であり そのオブジェクトのクラスが継承して持っているはずのメンバ関数であったと しても、明示的な型変換を介して関数に渡す必要がある。

明示的な型変換の必要性は、バーチャル関数に関しても同様である。

また Java などと違い動的な型変換のチェック機構は持たない。したがって、 コンパイル時の警告を抑えるためだけを目的とした、 十分なデータ型の検証を行なわない不用意な型変換を記述してはならない。



Jun IIO
2001-06-14