プログラミング

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++超入門⑦ ポインタと参照を理解しよう

次の記事:C++超入門⑨ クラスの基本を知ろう

← 記事一覧へ戻る