C++ 中的巢狀類

Jinku Hu 2021年10月2日
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;
}

通常,巢狀類可以為其成員使用通常的訪問說明符,並且規則將作為常規應用於封閉類。同時,巢狀類沒有被授予對封閉類成員的任何特殊訪問許可權。

Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ Class