なかなかに便利なクラスについて、概要をメモっときます^^
クラスの作成は、
***************************
class Oyaji
{
private:
・・・・・ローカル部分(クラスに属する関数などのみ使う変数などを宣言)
public:
・・・・・公開部分(どこでも使える)
};←セミコロンを忘れないように注意
***************************
と書いておけば、
Oyazi oyazi_1; だとか
Oyazi king_of_oyazi;
という具合に宣言して使ったり、型っぽい感じでも使えます(後述)。
中身を書いていくとき、どうしても外部から書き換えられたくないような(?)部分がない限りは、
public: 以下に書き込んでいけば良いのかと思います。
試しにVECTというクラスを作ります。
タブが効かず、全角スペースを打ってしまいますのでご了承ください。
コンストラクタとかデストラクタといった方たちが出てきます。
*ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー*
@コンストラクタ・・・クラスと同じ名前の関数。初期化時に呼ばれる。
複数作れて、引数を指定しなくても良い。
@デストラクタ・・・クラスが破棄されるときに呼ばれる。
*ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー*
***************************
class VECT
{
private:
char vectbuf[64];
public:
double x,y,z;
//デフォルト(コンストラクタ)
VECT(){
x=0;y=0;z=0;
}
//初期代入(これもコンストラクタ)
VECT(const double a, const double b, const double c){
x=a;y=b;z=c;
}
//デストラクタ
~VECT(){
}
};
**************************
これで例えば、
VECT test_v1; と宣言すれば x,y,z に0が入ってtest_v1が作られ、
VECT test_v2(10, 20, 30) と宣言すればそれぞれの値が入って作られます。
それぞれの値を見るときは、
test_v1.x だとか、 test_v1.y 等々。
ただし、private: の中に入っている vectbuf は外から見れないようになってます。
(test_v1.vectbuf を外で書いても「宣言されていません」とお叱りをうける。)
便利なのが、クラスで演算子(operator)を定義できることでしょうか。
関数も作れます。とりあえず宣言しておいて外に書くか、中に書き込むかは
好きなように。
全角スペースなのでコピると大変なことに。
***********************************
class VECT
{
private:
char vectbuf[64];
public:
double x,y,z;
//コンストラクターーーーーーーーーーー
//デフォルト
VECT(){
x=0;y=0;z=0;
}
//初期代入
VECT(const double a, const double b, const double c){
x=a;y=b;z=c;
}
//ーーーーーーーーーーーーーーーーーー
//関数(プロトタイプ宣言)
void show(HDC, int, int);
//演算子
const VECT operator +( const VECT& b ) const{
return VECT( x + b.x, y + b.y, z + b.z );
}
//デストラクタ
~VECT(){
}
};
//テキスト表示関数
void VECT::show(HDC hdc, int a, int b)
{
sprintf_s(vectbuf, "(%.1f, %.1f, %.1f)",x,y,z);
TextOut(hdc, a, b, vectbuf, (int)strlen(vectbuf));//
}
***********************************
これで、例えば
VECT test_v0;
VECT test_v1(1,2,3);
VECT test_v2(4,5,6);
と宣言しておいて、
test_v0 = test_v1 + test_v2; だとか、
test_v0 = test_v1 + VECT(2,3,4); など計算が楽にできます。
それからウィンドウプロシージャのWM_PAINTのところで
test_v0.show(hdc, 100,100);
とでもすれば確認も割と簡単です。
演算子については中でまたコンストラクタが呼び出されたり、演算途中にうっかり引数が書き換わったり等々を避けるために、
const ○○& といった形をとるんだとか。y軸回転をしたいときなんかは、
const VECT operator %( const double& rad ) const{
double tr_x = cos(rad)*x + sin(rad)*z;
double tr_y = y;
double tr_z = -sin(rad)*x + cos(rad)*z;
return VECT( tr_x, tr_y, tr_z );
}
を定義して、
test_v1 = VECT(1,2,3) % 1.57; (反時計回りに90°回転)
test_v1.show(hdc, 100,150);
等々です。
ちょっと見づらいですが、これの結果を(下)
