为什么列表类必须包含一个节点结构作为私有成员C++

为什么列表类必须包含一个节点结构作为私有成员C++,c++,data-structures,linked-list,computer-science,C++,Data Structures,Linked List,Computer Science,MarkWeiss的数据结构书中链表的实现让我有点困惑 List类内部包含一个节点结构,如下所示 ... class List { private: struct Node { ... }; ... public: ... private: int theSize; Node *head; Node *tail; }; 我的问题是,在Li

MarkWeiss的数据结构书中链表的实现让我有点困惑

List类内部包含一个节点结构,如下所示

...
class List {
    private:
        struct Node {
            ...
        };
    ... 

    public:
        ...

    private:
        int theSize;
        Node *head;
        Node *tail;
};
我的问题是,在List类中有一个节点结构真的有必要吗?我认为只要List类包含指向header和tail节点的指针就足够了。将节点结构作为私有成员有什么好处


谢谢

将节点结构声明为List类中的私有声明的原因是使其对实现保持私有。这将确保实现的具体细节不会泄漏到公共接口中。这是一种从内部实现细节中抽象接口的有效方法,可以自由更改这些细节,而不会影响列表类公共接口的用户

我的问题是,在List类中有一个节点结构真的有必要吗

没有必要,但更好

List::Node可以不同于Set::Node,后者可以不同于DList::Node,后者可以不同于Map::Node。在列表之外有一个只对实现列表有用的节点类是没有意义的。您必须创建ListNode、SetNode等,使它们具有不同的类型

将节点作为嵌套类确保类的详细信息特定于列表

它不会使用在List实现之外没有用处的类型名污染全局命名空间

它允许节点是私有的以列出。节点的详细信息不会向列表的用户公开,除非列表的实现选择公开。在大多数情况下,它不会暴露


节点类型必须在某个地方定义。你是在问为什么它被定义为列表中的私有类型而不是其他地方吗?我想你有点困惑。节点是一个内部结构,一个在另一个结构内部定义的结构。没有专用节点成员。您的问题不清楚。您认为在任何地方都不需要节点定义吗?IMHO,至少一个转发声明必须在List类之前存在,并且对List类可见。另请参见丘疹成语。对于歧义,我深表歉意。我知道节点必须在某处声明。当我实现链表时,我在链表类之外声明了它。我放在链表中的唯一数据是两个指针的头和尾。我只是想知道在链表内声明节点结构比在链表外声明节点结构有什么好处。非常感谢您的回答!但是,在链表内声明节点和在链表外声明节点之间有区别吗?不客气。区别在于,当它在链表内声明为私有时,列表外的任何代码都不能使用节点类,它对列表实现是完全私有的。如果它是在list类之外声明的,那么其他代码也可以访问该类。如果一个类不是为重用而设计的,即它是专门的,而不是为通用而设计的,那么保持它的私有性是很好的做法。Htthis还允许list类在结构上强制执行约束,而外部代码不能绕过这些约束,因为它们恰好可以访问节点结构,并且可以直接操作Next/Prev指针(例如)。当然,这不应该与安全机制混淆,如果调用方真的想这样做,他/她仍然可以做坏事,但至少这种设计试图将他们引导到正确的路径,并指出这不应该被弄乱,编译器将帮助尽可能地强制执行。这现在非常有意义!再次感谢!非常感谢!