【C++/C言語】構造体の入れ子(ネスト)の使い方 | 複雑なデータを構造化する方法

目次

はじめに

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 型のメンバ managerleadStaff を持っています。このように、自作した構造体を、intstd::string と同じように、別の構造体のメンバの型として使用できます。

salesDept.manager.id = 101;

これが、入れ子になった構造体のメンバにアクセスするための構文です。

  • salesDept.manager: まず、salesDept 変数(Department型)の manager メンバにアクセスします。この manager メンバ自身が Staff 型の構造体です。
  • .id: 次に、その manager 構造体の id メンバにアクセスしています。

このように、ドット演算子(.)を左から右へ順に繋げていくことで、目的の階層にあるメンバにたどり着くことができます。


まとめ

今回は、構造体を入れ子(ネスト)にして、より複雑なデータ構造を表現する方法を解説しました。

  • 構造体のメンバとして、別の構造体型の変数を定義できる。
  • 入れ子になったメンバへのアクセスは、ドット演算子 (.) を連鎖させる。

このテクニックは、プログラムで扱うデータが複雑になればなるほど、その真価を発揮します。現実世界のモノや概念を、構造体を組み合わせてプログラム内にモデル化することで、コードが非常に整理され、直感的で扱いやすいものになります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次