C++ 中的巢狀類

Jinku Hu 2023年10月12日
C++ 中的巢狀類

本文將解釋巢狀類和結構如何在 C++ 中工作。

在 C++ 中的另一個類中定義 classstruct 物件

有時,我們的類需要所謂的輔助資料型別,通常定義為自定義 structclass 物件。這些輔助類可以在其他類中定義,在這種情況下,它們將被稱為巢狀型別或巢狀類。後一個概念為程式設計師提供了許多優勢,例如良好的範圍邊界和訪問控制。

下面的示例演示了一個簡單的場景,我們可以在其中定義巢狀類。主類 - 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
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ Class