Класс Savings идентичен в этом отношении классу Checking : всё, что он делает, — это реализует метод withdrawal( ) .

«Любой подкласс классаAccount , который не переопределяет функциюtype( ) , будет абстрактным, и вы не сможете создать объект этого класса.»
[ Помни! ]
Функции, составляющие главную программу, теперь упрощены до предела. Функция getAccount( ) создаёт счёт класса Checking или Savings ( в зависимости от символа, введённого пользователем ). Это единственное место в программе, где происходит непосредственное обращение к подклассам класса Account .
Функция displayResults( ) проходит по связанному списку, опрашивая каждый объект Account для вывода информации о чековом или сберегательном счёте ( а также о других типах счетов, если таковые встретятся в дальнейшем ). Аналогично функция process( ) выполняет вклады и снятия со счетов ( объектов Account ). Как именно выполняются эти действия — определяют сами счета.
Метод displayResults( ) модифицирован для работы со связанным списком. В качестве аргумента этой функции передаётся связанный список, из которого функция считывает информацию. Цикл for начинается с первого объекта в списке, который возвращает вызов Node::firstNode( ) . Переход к следующему объекту в списке осуществляется при помощи функции nextNode( ) . Цикл завершает свою работу, когда вызов nextNode( ) возвращает 0.
Вывод на экран этой версии программы идентичен выводу предыдущей программы BUDGET2 с той разницей, что итоговая информация о счетах выводится в обратном порядке. Это связано с тем, что новые счета добавляются в начало списка.
Классы связанных списков...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 .
Читать дальше