2.5 構造体

2.5
構造体
強敵再び
構造体にする意味
より強い意味付け
►変数同士の関係性を表すことができる
たくさんの変数を一度に定義できる
►名前の一貫性を保てる
►タイプミスのリスクを減少できる
仕様変更に強い
►追加した変数の定義し忘れを防げる
2.5 構造体
2
より強い意味付け
構造体を使わなかった例
構造体を使った例
struct
ACTOR
int
playerHealth
int
health
int
playerAttack
int
attack
ACTOR player;
player.health = 100;
 別に問題はないが・・・
 より分かりやすい
► 所詮は別々の変数
► グループ化された変数
2.5 構造体
3
変数の一括定義
敵味方とも同じステータスを持つ事はよくある
►体力、攻撃力、防御力、X座標、Y座標 など
どれくらいの変数が必要か?
►必要な変数の数 = キャラの数 × ステータスの数
►これをベタ書きで定義したら・・・?
2.5 構造体
4
変数の一括定義
int playerHealth;
int playerAttack;
int playerDefence;
int playerX;
int playerY;
int enemyHealth;
int enemyAttack;
int enemyDefence;
int enemyX;
int enemyY;
int friendHealth;
int friendAttack;
int friendDefence;
// まだまだァ!
構造体
を使うと
struct CHARACTER {
int health;
int attack;
int defence;
int x;
int y;
};
CHARACTER player;
CHARACTER enemy;
CHARACTER friend;
短いし見やすい
2.5 構造体
5
仕様変更に強い
作ってる途中でのシステム変更はよくある
►「すばやさ」のステータスを追加したり
►「めぢから」のステータスを削除したり
修正箇所はどれくらい?
2.5 構造体
6
仕様変更に強い
int
int
int
int
playerHealth;
playerAttack;
playerDefence;
playerSpeed;
int
int
int
int
enemyHealth;
enemyAttack;
enemyDefence;
enemySpeed;
int
int
int
int
friendHealth;
friendAttack;
friendDefence;
friendSpeed;
struct CHARACTER {
int health;
int attack;
int defence;
int speed;
};
構造体
を使うと
CHARACTER player;
CHARACTER enemy;
CHARACTER friend;
変更が少ない
2.5 構造体
7
クラスと紙一重
関数を内蔵してみよう
2.5 構造体
8
CとC++での違い
Cでは・・・
►構造体は存在するがクラスは存在しない
►構造体には関数を入れられない
►型名の struct を省略できない
C++では・・・
►構造体もクラスも存在する
►構造体にも関数を入れられる
►型名の struct を省略できる
これからするのはC++の話
2.5 構造体
9
書き方は簡単
今まで作った関数を構造体の中に書くだけ
►自身の持つ変数を使うことが出来る
►他は本当に今まで通り
struct ACTOR {
POINT location;
void move(int x, int y) {
location.x += x;
location.y += y;
}
};
2.5 構造体
10
どんな関数を内蔵するか
構造体の意味をよく考えよう
►内蔵する意味のない関数を内蔵すべきではない
►自身の変数に関係するかどうかがひとつの目安
struct
IMAGE
int
handle
構造体内のどの変数にも
関係ないね
int
sum(int, int)
size
getSize(void)
GetGraphSize関数に
handleを渡している
void
draw(int, int)
DrawGraph関数に
handleを渡している
2.5 構造体
これらの関数については
リファレンスを参照
11
どんな形を目指すか
最終的には・・・
►その構造体への指示を全て関数で行えるようにする
►構造体の外にある関数を出来るだけ少なくする
(ただし関係ない関数を入れないこと)
►独立した機械を作るイメージ
struct
ACTOR
2.5 構造体
12