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