C++ のネストされたクラス

胡金庫 2023年10月12日
C++ のネストされたクラス

この記事では、ネストされたクラスと構造が C++ でどのように機能するかを説明します。

C++ の別のクラス内に class または struct オブジェクトを定義する

時々、私たちのクラスはいわゆるヘルパーデータ型を必要とし、通常はカスタムの struct または class オブジェクトとして定義されます。これらのヘルパークラスは他のクラス内で定義でき、そのような場合、ネストされた型またはネストされたクラスと呼ばれます。後者の概念は、優れたスコープ境界やアクセス制御など、プログラマーに多くの利点を提供します。

次の例は、ネストされたクラスを定義する可能性のある単純なシナリオを示すために示されています。メインクラス-CircularList は循環リンクリストを実装し、-ListNode という名前の複合型であるノードを定義する必要があります。この場合、後者は struct キーワードを使用してグローバルスコープで定義されます。したがって、そのメンバーは他のクラスから公にアクセスできます。

#include <iostream>
#include <string>

using std::string;

struct ListNode {
  struct ListNode *next = nullptr;
  string data;
} typedef ListNode;

class CircularList {
 public:
  explicit CircularList(string data) {
    head = new ListNode;
    head->next = head;
    head->data = std::move(data);
    end = head;
  };

  ListNode *insertNodeEnd(string data);
  ListNode *insertNodeHead(string data);
  void printNodes();

  ~CircularList();

 private:
  ListNode *head = nullptr;
  ListNode *end = nullptr;
};

int main() { return EXIT_SUCCESS; }

または、ListNode 定義を CircularList クラスに移動することもできます。ListNode はグローバル名前空間ではアクセスできないため、ネストされたクラス名の前に CircularList 名前空間を含める必要があります。さらに、通常のアクセス制御ルールがネストされたクラスにも適用されるため、ネストされたクラスがどのアクセス指定子を持っているかが重要です。

この場合、ListNode はパブリックメンバークラスとして定義されているため、CircularList::ListNode 表記を使用して main 関数からアクセスできます。ネストされたクラスが保護されたメンバーとして定義されている場合、クラス、後者のフレンドクラス、および派生クラスを囲むことでアクセスできます。一方、ネストされたクラスのプライベート指定子は、それを囲むクラスとフレンドクラス内でのみアクセス可能であることを意味します。

#include <iostream>
#include <string>

using std::string;

class CircularList {
 public:
  // Helper Types ->
  struct ListNode {
    struct ListNode *next = nullptr;
    string data;
  } typedef ListNode;

  // Member Functions ->
  explicit CircularList(string data) {
    head = new ListNode;
    head->next = head;
    head->data = std::move(data);
    end = head;
  };

  ListNode *insertNodeEnd(string data);
  ListNode *insertNodeHead(string data);
  void printNodes();

  ~CircularList();

 private:
  ListNode *head = nullptr;
  ListNode *end = nullptr;
};

int main() {
  //    ListNode *n1; // Error
  CircularList::ListNode *n2;

  return EXIT_SUCCESS;
}

一般に、ネストされたクラスは、そのメンバーに対して通常のアクセス指定子を持つことができ、ルールは通常どおり、それを囲むクラスに適用されます。一方、ネストされたクラスには、それを囲むクラスのメンバーへの特別なアクセスは許可されません。

著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Class