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