C++超入門⑧ 構造体とenumでデータを整理しよう
structとenum classを使い、キャラクター名、HP、状態など、関係するデータをひとまとまりにします。
第8回では、関係するデータをまとめる構造体と、選択肢を分かりやすく表すenumを学びます。
ゲームのキャラクターなら、名前、HP、移動速度などを一つにまとめられます。
この回でできるようになること
- structで新しいデータの型を作る
- ドットを使って構造体の値へアクセスする
- 構造体を関数へ渡す
- enum classで状態や種類を表す
構造体とは
構造体は、複数の値を一つにまとめた、自分で作れる型です。
#include <string>
struct Player {
std::string name;
int hp;
double speed;
};
Playerという新しい型を作り、その中にname、hp、speedをまとめています。
構造体の中にある一つひとつの変数をメンバーと呼びます。
構造体を使う
#include <iostream>
#include <string>
struct Player {
std::string name;
int hp;
double speed;
};
int main() {
Player hero = {"Aoi", 100, 4.5};
std::cout << hero.name << '\n';
std::cout << hero.hp << '\n';
hero.hp = 80;
std::cout << hero.hp << '\n';
return 0;
}
hero.nameのように、変数名とメンバー名をドットでつなぎます。
Player型の変数を複数作れば、キャラクターごとのデータを分けて保存できます。
構造体を関数へ渡す
void showPlayer(const Player& player) {
std::cout << player.name << ": HP " << player.hp << '\n';
}
**Player&**は、Player型の値を参照で受け取る書き方です。大きなデータを毎回コピーせずに済みます。
先頭のconstは、関数の中からplayerを変更しないという約束です。
showPlayer(hero);
前回のポインタと参照の記事と合わせて読むと、&の意味を確認できます。
enum classとは
キャラクターの状態を数字だけで表すと、1や2が何を意味するか分かりにくくなります。
enum classを使うと、決まった選択肢へ名前を付けられます。
enum class PlayerState {
Idle,
Running,
GameOver
};
使うときは、enum classの名前と選択肢を**::**でつなぎます。
PlayerState state = PlayerState::Running;
if (state == PlayerState::Running) {
std::cout << "走っています。\n";
}
Idleは待機中、Runningは走行中、GameOverはゲーム終了というように、数字より意味を読み取りやすくなります。
switch文と組み合わせる
switch (state) {
case PlayerState::Idle:
std::cout << "待機中です。\n";
break;
case PlayerState::Running:
std::cout << "走っています。\n";
break;
case PlayerState::GameOver:
std::cout << "ゲーム終了です。\n";
break;
}
選択肢が決まっている状態管理と、enum classは相性がよい組み合わせです。
structとenum classの使い分け
| 機能 | 役割 |
|---|---|
| struct | 名前、HP、速度など複数の値をまとめる |
| enum class | 待機中、走行中など、決まった選択肢から一つを表す |
Player構造体の中にPlayerState型のメンバーを入れることもできます。
小さな練習
商品名、価格、在庫数をまとめるProduct構造体を作ってください。
Product型の変数を一つ作り、ドットを使って3つの値を表示してみましょう。
模範解答
#include <iostream>
#include <string>
struct Product {
std::string name;
int price;
int stock;
};
int main() {
Product product{"キーボード", 4800, 6};
std::cout << "商品名: " << product.name << '\n';
std::cout << "価格: " << product.price << "円\n";
std::cout << "在庫: " << product.stock << "個\n";
return 0;
}
解説
Product構造体へ種類の違う3つの値をまとめています。Product型の変数を作るときは、構造体で宣言した順番に初期値を入れます。値を読むときはproduct.nameのようにドットを使います。
まとめ
- structを使うと、関係する値を一つの型へまとめられます。
- メンバーへは、ドットを使ってアクセスします。
- enum classは、決まった状態や種類を名前で表します。
次の記事:C++超入門⑨ クラスの基本を知ろう