2012/06/17

C++ クラスからオブジェクトを複数作る

C++ではCの構造体を拡張してクラスとして扱う。構造体は基本的に型の違う複数変数を扱うもの。対してクラスは変数と関数をまとめて扱うのが基本。クラスを利用するためにはメモリに展開する必要がある。そのことをインスタンス化すると言う。インスタンス化したものをオブジェクトと言う。

実際にC++で試していたら、Cでも構造体を使って似たようなものが出来そうだなぁ?と思って、Cでクラスぽいことをやってみた。構造体内部で関数ポインタを使いまくって、カプセル化したクラスぐらいまでは作れた。しかし・・・かなりソースが混沌としてしまった。たぶん誰がやってもCで見やすいというレベルのソースは書けない気がする。やっぱりクラスを利用したオブジェクト指向プログラミングをするなら素直にC++でやるべきだと思えた。ただCでもオブジェクト指向的プログラミングは可能だということが分かった。

またC++のクラスの書き方はJavaとは大分違うので、C++独特の構造体風クラスの書き方に慣れる必要がある。

クラスのインスタンス化

mainから他のクラスをインスタンス化して実行してみるサンプル。
#include <iostream>
//クラスの宣言
class Box{
public:
  Box();//コンストラクタ
  ~Box();//デストラクタ
  void Add(int add);
  void Sub(int sub);
  void Clear();
  int Get();
private:
  int n;
};
//コンストラクタ 初期設定
Box::Box(){
  std::cout << "constructor\n";
  n = 10;
}
//デストラクタ メモリ解放
Box::~Box(){
  std::cout << "destructor\n";
}
//メンバ関数(メソッド) Add
void Box::Add(int add){
  std::cout << "Add: " << add << "\n";
  n += add;
}
//メンバ関数(メソッド) Sub
void Box::Sub(int sub){
  std::cout << "Sub: " << sub << "\n";
  n -= sub;
  if(n < 0) Clear();
}
//メンバ関数(メソッド) Clear
void Box::Clear(){
  std::cout << "Clear\n";
  n = 0;
}
//メンバ関数(メソッド) Get
int Box::Get(){
  return n;
}
//メイン関数
int main(void){
  Box box1; //インスタンス化
  //box1.n = 20;//エラーになる
  box1.Add(440);
  std::cout << "box1 Get: " << box1.Get() << "\n"; 
  Box box2; //インスタンス化
  box2.Add(20);
  box1.Sub(200);
  std::cout << "box1 Get: " << box1.Get() << "\n"; 
  std::cout << "box2 Get: " << box2.Get() << "\n";
  return 0;
}
いきなり長めになってしまった。やっていることはシンプルで、ひとつのクラスから、2つインスタンス化して、そこに値を足したり、引いたりして、残っている値を参照するプログラム。クラスの宣言部分に具体的な処理を書いてもよいのだが、その場合インライン関数となる。通常は外に書く。
コンストラクタは、初期化部分でインスタンス化してオブジェクトが作られたときに、「n」に10をあらかじめ入れるようにした。
デストラクタは使わなくなったらオブジェクトを破棄してメモリを解放する。
外からアクセス可能なメンバ関数。「Add」「Sub」「Clear」「Get」。
外からはアクセスできないprivateな変数「n」。これはmainでコメントアウトしている「box1.n = 20;」を実行しようとすると、コンパイル時にエラーになる。このようにすることで、不用意に値が変更されないようにする。値を変更するときはメンバ関数を通して行うことになる。これをカプセル化という。もしクラスで「private」を削除した場合は、「public」となるので、メイン関数からでも直接値を変更できるようになる。
Cで、これと同じことをやると、かなり混沌とするが、これならすっきり?という印象だ。
constructor
Add: 440
box1 Get: 450
constructor
Add: 20
Sub: 200
box1 Get: 250
box2 Get: 30
destructor
destructor


C++言語 Meadow & MinGW GCC 目次