C++ 中的巢狀類
Jinku Hu
2023年10月12日
本文將解釋巢狀類和結構如何在 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
函式訪問它。如果巢狀類被定義為 protected
成員,則可以通過封閉類、後者的友元類和派生類訪問它。另一方面,巢狀類的 private
說明符意味著它只能在封閉類和友元類中訪問。
#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;
}
通常,巢狀類可以為其成員使用通常的訪問說明符,並且規則將作為常規應用於封閉類。同時,巢狀類沒有被授予對封閉類成員的任何特殊訪問許可權。
作者: Jinku Hu