Классы связанных списков...363

Связанный список создаётся при помощи двух классов — AccountLinkedList и Node, которые определены в заголовочном файле AccountLinkedList.h.

    /* AccountLinkedList — поддерживает связанный */

    /*                    список объектов Account */

    #ifndef _ACCOUNTLINKEDLIST_

    #define _ACCOUNTLINKEDLIST_

_________________

363 стр. Глава 31. Программа BUDGET

    /* Данное предварительное объявление — неприятное следствие того, что Account не является частью пространства имён Lists. Этой неприятности мы сумеем избежать в следующей версии программы */

    class Account ;

    namespace Lists

    {

        /* Предварительное объявление классов */

        class AccountLinkedList ;

        class Node ;

        /* LinkedList — связанный список объектов Node */

        class AccountLinkedList

        {

          public :

            AccountLinkedList( ) { pHead = 0 ; }

            void addNode( Node*  pNode ) ;

            Node* firstNode( ) { return pHead ; }

          protected :

            Node* pHead ;

        } ;

        /* Node — узел в связанном списке, указывающий на объект Account */

        class Node

        {

            friend class AccountLinkedList ;

          public :

            Node( AccountLinkedList* pL , Account* pAcc )

            {

                pList = pL ;

                pNext = 0 ;

                pAccount = pAcc ;

                pL -> addNode( this ) ;

            }

            static Node* firstNode( AccountLinkedList* pList )

            {

                return pList -> firstNode( ) ;

            }

            Node* nextNode( ) { return pNext ; }

            Account* currentAccount( ) { return pAccount ; }

          protected :

            AccountLinkedList* pList ;

            Node* pNext ;

            Account* pAccount ;

        } ;

    }

    #endif

_________________

364 стр. Часть 6. Великолепная десятка

Я поместил оба класса — и AccountLinkedList, и Node — в пространство имён Lists для того, чтобы отделить их от класса Account. Класс AccountLinkedList содержит только заголовочный указатель связанного списка объектов Node.

«Заголовочный указатель — это указатель на первый элемент списка.»

[Помни!]

Основная работа выполняется в классе Node. Каждый узел Node указывает на следующий в списке объект при помощи члена pNext. Кроме того, узел также указывает на объект Account при помощи указателя pAccount. Указатель pList указывает на связанный список, которому принадлежит данный узел.

Ещё раз взгляните на исходный файл BUDGET3.срр. Функция main( ) определяет объект класса AccountLinkedList — это и есть связанный список. Ссылка на него передаётся конструктору Account. Конструктор Node( ), который вызывается из конструктора Account, создаёт узел, который является членом данного связанного списка и указывает на создаваемый счёт.

Маленький исходный файл AccountLinkedList.срр нужен для того, чтобы позволить классу AccountLinkedList обратиться к члену Node. Дело в том, что класс Node определён в заголовочном файле после класса AccountLinkedList, поэтому обращаться к его членам в определении класса AccountLinkedList нельзя. Изменение порядка объявлений не решает данную проблему, поскольку класс Node в AccountLinkedList.h также содержит ссылки на класс AccountLinkedList.

    /* AccountLinkedList — поддерживает связанный */

    /*                   список объектов Account */

    #include "AccountLinkedList.h"

    namespace Lists

    {

        /* addNode — добавляет узел в начало текущего связанного списка */

        void AccountLinkedList::addNode( Node* pNode )

        {

            pNode -> pNext = pHead ;

            pHead = pNode ;

        }

    }