Читать «С++ для "чайников" .» онлайн - страница 248
Стефан Рэнди Дэвис
[]
Выражение template < class Т > class LinkedList представляет собой предварительное объявление шаблона, необходимое для класса Node.
«Не забывайте о том, что шаблоны классов LinkedList и Node не являются реальными классами до тех пор, пока параметр Т не будет заменён действительным классом.»
[]
Шаблон класса Node сконструирован для работы в качестве узла связанного списка. Каждый узел указывает на объект класса Т, который будет определён позже. Конструктор инициализирует члены-указатели: pList указывает на LinkedList, членом которого является данный объект Node, pObject указывает на объект типа Т, a pNext инициализируется значением 0 , указывающим, что пока узел не является членом списка.
"Активный метод" next ( Node< T >* ) добавляет текущий узел в список путём инициализации указателя pNext. "Пассивный метод" next( ) просто возвращает следующий объект Node< T > в списке. Это обычная практика кодирования, когда функция fn( ) возвращает текущее значение объекта, a fn( Т ) устанавливает его значение на основе аргумента.
Эта версия addNode( ) более усовершенствована по сравнению с представленной в программе BUDGET3, поскольку добавляет узел в конец списка. Преимущество такого подхода в том, что объекты считываются из списка в том же порядке, в котором были в него внесены, а недостаток в том, что метод lastNode( ) должен выполнять проход по всему списку всякий раз, когда требуется внести в список новый объект. Это может существенно замедлить работу программы при большом количестве элементов в списке.
Исходный код BUDGET4...368
Исходный код программы BUDGET4 практически идентичен коду BUDGET3.
/* BUDGET4.CPP — в этой версии используется */
/* шаблон класса LinkedList */
//
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std ;
#include "LinkedList.h"
/* Account — абстрактный класс, включающий */
/* общие свойства различных счетов */
class Account ;
template class LinkedList< Account > ;
template class Node< Account > ;
class Account
{
public :
Account::Account( LinkedList< Account >* pList ,
unsigned accNo )
{
/* Инициализация данных-членов */
_________________
368 стр. . Великолепная десятка
accountNumber = accNo ;
balance = 0 ;
/* Внесение в список */
pNode = new Node< Account >( pList , this ) ;
pList -> addNode( pNode ) ;
count++ ;
}
/* Функции доступа */
int accountNo( ) { return accountNumber ; }
double acntBalance( ) { return balance ; }
static int noAccounts( ) { return count ; }
static Account* first( LinkedList< Account >* pLinkedList )
{
Node< Account >* pNode = pLinkedList -> firstNode( ) ;