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