« 2010年4月 | トップページ | 2010年6月 »

2010年5月

2010年5月 7日 (金)

C++第12回:クラスの作成

なかなかに便利なクラスについて、概要をメモっときます^^

クラスの作成は、

 
***************************

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);

等々です。
ちょっと見づらいですが、これの結果を(下)

Mn_d1


« 2010年4月 | トップページ | 2010年6月 »