では,まず「点」を定義してみよう.ここでの「点」は,数学的な 座標上の「点」ではなく,画面上に描かれた点のことだ.
class Point {
private:
vector2D coord;
int color;
....
};
ここでの``class''は,構造体定義の``struct''と
ほぼ同じだと思ってよい.ちょっと違うのは,定義の中に
private:というラベルがついていることだ.private:
というラベルは,そこから下の定義がメンバ関数以外からアクセスできない
という宣言だ.したがって,Pointのメンバ関数以外では,
Point p;
p.coord.x = 10;
のような記述はできないことになる.そのかわりに,Point::coord
の値をセットしたり取り出したりするメンバ関数を定義して,その関数を
通じてPoint::coordの値を操作するわけだ.
もちろん,Point::coordの値を外部から直接操作したいこともある. そんな場合には
class Point {
public:
vector2D coord;
int color;
....
};
と宣言する.しかし,クラスのメンバ変数をpublicにするのは,一般に
あまり好まれない.この例でいうと,このクラスのデータ
(これをクラスPointのインスタンスと呼ぶ)は,画面上に実際に
表示されている点に対応している.このインスタンスの変数の値を
直接いじってしまうと,実際に画面上に表示されている点と,
インスタンスが保持している情報にずれが生じてしまう.これを防ぐためには,
たとえば
class Point {
private:
....
public:
void set(x,y) {
coord.x = x;
coord.y = y;
draw_point(x,y,color);
}
....
};
のようなメンバ関数を定義しておき,常にそのメンバ関数を通して
インスタンスの変数を操作するようにする.メンバ関数の中で,
インスタンスが保持する情報と画面上の点との整合性が取れるように
しておけば,情報のずれは生じない.このように,情報を外部から
直接アクセスできないようにしておき,情報へのアクセスのためには
全体の整合性がとれるようなインタフェース関数を用意するという
のがC++の一般的なプログラミングスタイルだ.