はじめに
C++やC言語の構造体(struct
)は、入れ子(ネスト)にすることで複雑なデータ構造を表現できます。その応用として、構造体のメンバとして、別の構造体の「配列」を持つことも可能です。
これにより、「クラス」が「生徒の配列」を持つ、「部署」が「社員の配列」を持つ、といった、現実世界における「1対多」の包含関係を、プログラムの中で綺麗に表現することができます。
この記事では、構造体のメン-バとして構造体の配列を定義し、その配列の各要素のメンバにアクセスする方法を、分かりやすく解説します。
構造体の配列をメンバにするサンプルコード
このコードは、まず Player
(選手)という基本的な構造体を定義します。次に、その Player
の配列をメンバとして持つ Team
(チーム)という、より大きな構造体を定義します。
完成コード
#include <iostream>
#include <string>
#include <vector> // C++で推奨される動的配列 (std::vector) を使う場合
// 「選手」構造体の定義
struct Player {
int jerseyNumber; // 背番号
std::string name; // 選手名
};
// 「チーム」構造体の定義
struct Team {
std::string teamName; // チーム名
Player players[3]; // 選手リスト(Player型の配列をメンバとして持つ)
};
int main() {
// 1. 「チーム」構造体の変数を作成
Team myTeam;
// 2. チーム名を設定
myTeam.teamName = "イーグルス";
// 3. チーム内の選手配列の各要素にデータを設定
// 1人目の選手 (インデックス 0)
myTeam.players[0].jerseyNumber = 10;
myTeam.players[0].name = "佐藤";
// 2人目の選手 (インデックス 1)
myTeam.players[1].jerseyNumber = 7;
myTeam.players[1].name = "鈴木";
// 3人目の選手 (インデックス 2)
myTeam.players[2].jerseyNumber = 4;
myTeam.players[2].name = "高橋";
// 4. 設定した値をループで表示して確認
std::cout << "チーム名: " << myTeam.teamName << std::endl;
std::cout << "--- 選手一覧 ---" << std::endl;
for (int i = 0; i < 3; i++) {
std::cout << "背番号: " << myTeam.players[i].jerseyNumber
<< ", 名前: " << myTeam.players[i].name << std::endl;
}
return 0;
}
実行結果
チーム名: イーグルス
--- 選手一覧 ---
背番号: 10, 名前: 佐藤
背番号: 7, 名前: 鈴木
背番号: 4, 名前: 高橋
コードの解説
struct Team { ... Player players[3]; ... };
Team
構造体の定義の中で、Player players[3];
という行が、Player
型の配列をメンバとして宣言している部分です。これにより、Team
型の変数は、3人分の Player
データを格納できる領域を持つことになります。
myTeam.players[0].jerseyNumber = 10;
入れ子になった構造体の配列のメンバにアクセスするための構文です。左から右へ順に解釈します。
myTeam
:Team
型の変数myTeam
にアクセスします。.players
: その中のplayers
というメンバ(Player
型の配列)にアクセスします。[0]
:players
配列の、インデックス0
番目(最初)の要素にアクセスします。この要素はPlayer
型の構造体です。.jerseyNumber
: 最後に、そのPlayer
構造体のjerseyNumber
というメンバにアクセスし、値を代入しています。
変数名.配列メンバ名[インデックス].メンバ名
という構文で、目的のデータに正確にアクセスできます。
まとめ
今回は、構造体のメンバとして「構造体の配列」を定義し、その要素にアクセスする方法を解説しました。
- 構造体のメンバとして、**別の構造体型の「配列」**を定義できる。
- 入れ子になった配列の要素のメンバには、
変数名.配列名[インデックス].メンバ名
のようにアクセスする。
このテクニックは、1つのまとまりが、複数の同じ種類のデータを持つような、現実世界の複雑な関係性をモデル化する際に非常に強力です。例えば、1つの「注文」が複数の「注文明細」を持つ、といったデータ構造を綺麗に表現できます。