Почему класс List должен содержать структуру Node как закрытый член C ++ - PullRequest
0 голосов
/ 17 марта 2019

Реализация Linked List в книге по структуре данных Марка Вейсса меня немного смущает.

Класс List содержит структуру Node внутри следующим образом.

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

    public:
        ...

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

Мой вопрос: действительно ли необходимо иметь структуру Node внутри класса List? Я думаю, пока класс List содержит указатель на заголовок и хвостовой узел достаточно. В чем преимущество наличия структуры Node в качестве частного члена?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 17 марта 2019

Причина, по которой структура Node будет объявлена ​​как частное объявление в классе List, заключается в том, что она остается частной для реализации. Это гарантирует, что конкретные детали реализации не попадут в открытый интерфейс. Это эффективный способ абстрагировать интерфейс от внутренних деталей реализации, оставляя эти детали свободными для изменения, не влияя на пользователей открытого интерфейса классов List.

0 голосов
/ 26 марта 2019

Мой вопрос: действительно ли необходимо иметь структуру Node внутри класса List?

Это не обязательно, но лучше.

  1. List::Node может отличаться от Set::Node, что может отличаться от DList::Node, что может отличаться от Map::Node. Наличие класса Node вне List, который полезен только для реализации List, не имеет смысла. Вам нужно будет создать ListNode, SetNode и т. Д., Чтобы сделать их различными типами.

  2. Наличие Node в качестве вложенного класса гарантирует, что сведения о классе относятся к List.

  3. Он не загрязняет глобальное пространство имен именами типов, которые бесполезны вне реализации List.

  4. Это позволяет Node быть от private до List. Детали Node не предоставляются пользователям List, если только реализация List не выберет. В большинстве случаев он не выставляется.

...