はじめに
C++やC言語の構造体(struct
)は、関連する変数を一つにまとめる便利な機能ですが、その真価は**入れ子(ネスト)**にすることで、さらに発揮されます。
「会社」という大きな構造体の中に、「社員」という別の構造体を複数持たせる、といったように、構造体のメンバとして、別の構造体型の変数を持つことができます。これにより、現実世界の複雑な階層構造を、プログラムの中で直感的かつ綺麗に表現することが可能になります。
この記事では、構造体を入れ子にして使い、ネストした先のメンバにアクセスする方法を、分かりやすく解説します。
入れ子構造のサンプルコード
このコードは、まず Staff
(社員)という基本的な構造体を定義します。次に、その Staff
型を使って、Department
(部署)という、より大きな構造体を定義します。
完成コード
#include <iostream>
#include <string>
// --- 基本となる「社員」構造体の定義 ---
struct Staff {
int id;
std::string name;
};
// --- 「社員」構造体をメンバとして持つ、「部署」構造体の定義 ---
struct Department {
std::string departmentName; // 部署名
Staff manager; // 部長(Staff型)
Staff leadStaff; // リーダー(Staff型)
};
int main() {
// --- 1. 「部署」構造体の変数(実体)を作成 ---
Department salesDept;
// --- 2. 各メンバに値を代入 ---
salesDept.departmentName = "営業部";
// ネストした構造体のメンバにアクセス
salesDept.manager.id = 101;
salesDept.manager.name = "鈴木 一郎";
salesDept.leadStaff.id = 205;
salesDept.leadStaff.name = "佐藤 花子";
// --- 3. メンバの値を参照して表示 ---
std::cout << salesDept.departmentName << " の情報:" << std::endl;
std::cout << "部長: "
<< salesDept.manager.name
<< " (ID: " << salesDept.manager.id << ")"
<< std::endl;
std::cout << "リーダー: "
<< salesDept.leadStaff.name
<< " (ID: " << salesDept.leadStaff.id << ")"
<< std::endl;
return 0;
}
実行結果
営業部 の情報:
部長: 鈴木 一郎 (ID: 101)
リーダー: 佐藤 花子 (ID: 205)
コードの解説
struct Department { ... };
Department
構造体は、std::string
型のメンバ departmentName
に加えて、Staff
型のメンバ manager
と leadStaff
を持っています。このように、自作した構造体を、int
や std::string
と同じように、別の構造体のメンバの型として使用できます。
salesDept.manager.id = 101;
これが、入れ子になった構造体のメンバにアクセスするための構文です。
salesDept.manager
: まず、salesDept
変数(Department
型)のmanager
メンバにアクセスします。このmanager
メンバ自身がStaff
型の構造体です。.id
: 次に、そのmanager
構造体のid
メンバにアクセスしています。
このように、ドット演算子(.
)を左から右へ順に繋げていくことで、目的の階層にあるメンバにたどり着くことができます。
まとめ
今回は、構造体を入れ子(ネスト)にして、より複雑なデータ構造を表現する方法を解説しました。
- 構造体のメンバとして、別の構造体型の変数を定義できる。
- 入れ子になったメンバへのアクセスは、ドット演算子 (
.
) を連鎖させる。
このテクニックは、プログラムで扱うデータが複雑になればなるほど、その真価を発揮します。現実世界のモノや概念を、構造体を組み合わせてプログラム内にモデル化することで、コードが非常に整理され、直感的で扱いやすいものになります。