为什么List类必须包含一个Node结构作为私有成员C ++

时间:2019-03-16 21:30:55

标签: c++ data-structures linked-list computer-science

马克·韦斯(Mark Weiss)的数据结构书中链接列表的实现使我有些困惑。

List类在内部包含一个Node结构,如下所示。

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

    public:
        ...

    private:
        int theSize;
        Node *head;
        Node *tail;
};

我的问题是,在List类内部确实有一个Node结构真的必要吗?我认为只要List类包含指向标头和尾节点的指针就足够了。将Node结构作为私有成员有什么优势?

谢谢!

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

  

我的问题是,在List类内部是否真的需要一个Node结构?

没有必要,但是更好。

  1. List::Node可以与Set::Node不同,后者可以与DList::Node不同,而Map::Node可以不同于Node。在List之外拥有List类仅对实现ListNode有用,这没有任何意义。您必须创建SetNodeNode等以使其成为不同的类型。

  2. List作为嵌套类可以确保该类的详细信息特定于List

  3. 它不会污染在Node的实现之外没有用的类型名称的全局名称空间。

  4. 它允许将private设为ListNode。除非List的实现选择这样做,否则List的详细信息不会公开给.text的用户。在大多数情况下,它不会暴露。