C++ 中的嵌套类
本文将解释嵌套类和结构如何在 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;
}
通常,嵌套类可以为其成员使用通常的访问说明符,并且规则将作为常规应用于封闭类。同时,嵌套类没有被授予对封闭类成员的任何特殊访问权限。
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