第一章:基礎知識
7.構造体
これまで、変数の宣言は以下のようにしてきました。
char *name; int hp; int mp; int attack; int defense;
これまでの知識では、たとえばゲームのキャラクターを作るときは、このようにキャラクターごとに、この大量の変数を個別に宣言しなければなりませんでした。それではダラダラと長くなってキャラクターごとにどの変数を割り当てていたか間違ってしまうこともあると思います。このような場合に、これらをひとまとめにしたい時、構造体という物を利用します。
構造体の記入方法は以下の通りです。
struct CHARACTER{ char *name; int hp; int mp; int attack; int defense; };
これで、CHARACTERというキャラクターの代表的なパラメータを一度に宣言できる変数の型のようなものが作成された事になります。
これを利用するときは
CHARACTER maou,yuusha;
と、通常の変数を宣言するときのように利用します。この構造体の中にある変数へアクセスする時は次のようにします。
CHARACTER maou; char c[]="Maou"; maou.name=c; maou.hp=100; maou.mp=100; maou.attack=50; maou.defense=20;
このように、変数名の後ろに.(ドット)演算子を付けることで構造体の中の個別の変数にアクセス出来ます。このときの.は小数は全く関係ないので、アクセスする時のルールとして覚えてください。もちろん数字の後ろに.を付けて数字を書けばそれは小数ですが、変数名の後ろに.を付けたらそれは構造体へのアクセスという意味になります。もちろん構造体以外の変数では使えません。
構造体も、もちろんポインタ変数が使えます。しかし、ポインタを使うと構造体のメンバーへアクセスする時の演算子が変わります。
struct _abc{ int a; int b; int c; }; _abc *x=new _abc; x->a=100; x->b=200; x->c=300; Caption = x -> a + x -> b + x -> c ; delete x;
このようにアクセスします。.(ドット)の代わり->(矢印演算子)が使われるようになります。
構造体のメモリを確保した場合、deleteはその構造体のポインタを記述するだけでOKです。わざわざ構造体のメンバーすべてに対してdeleteする必要はありません。
ポインタなので次のような書き方も出来ます。
(*x).a=100;
実体からアクセスするときは.を使い、アドレスからメンバーを参照するときは->を使うようになります。
アドレスからアクセスする時は->を使うと言うことは、ポインタを使わない通常の変数宣言の場合、次のように書くことも出来ます。
(&x)->a=100;
構造体では宣言した変数を初期化したいと思っても次のようには出来ません。
struct _abc{ int a=0; int b=0; };
初期化をしたいときは次のようにします。
struct _abc{ int a; int b; _abc(){ a=100; b=0; } };
これはコンストラクタと言って変数が宣言されたと同時に実行される関数です。
ちなみに、変数が解放されるときに実行されるものをデストラクタと言い、次のように書きます。
struct _abc{ int a; int b; ~_abc(){ Form1->Caption="デストラクタ"; } };
デストラクタはコンストラクタと同じく構造体の名前を書きますが、頭に~(チルダ)を付けます。
通常デストラクタではコンストラクタの初期化で確保したメモリを解放する処理を書いたりします。
初期化でコンストラクタが関数と書きましたが、つまり構造体には関数を含めることが出来ます。
struct _abc{ int a; int b; int func(){ return a+b; } _abc(){ a=10; b=5; } }; _abc x; Caption = x.func();
ここまで説明しましたが、実際の所、構造体で関数を駆使して使用するというシーンはほとんどありません。それは何故かというと、クラスが構造体の上位版とも言える機能を持っているからで、C++の機能とは言え、クラスの概念はほぼすべての言語で利用されています。構造体でもここまでは出来る程度に覚えておいてください。