Читать «С++ для "чайников" .» онлайн - страница 244

Стефан Рэнди Дэвис

            if ( transaction < 0 )

            {

                pAccount -> withdrawal( -transaction ) ;

            }

        } while ( transaction != 0 ) ;

    }

Первый класс, содержащийся в BUDGET3, — Account. Этот класс инкапсулирует всё, что мы знаем об обобщённых счетах, а именно:

■■■

■ они распознаются по номерам;

■ каждый счёт имеет баланс;

■ пользователь может вкладывать или снимать деньги со счёта.

■■■

В этом классе сведён воедино код, общий для классов Savings и Checking из программы BUDGET2. Теперь Savings и Checking представляют собой подклассы Account. Я сделал функцию Account::type( ) чисто виртуальной, так что она обязана быть переопределена в каждом из подклассов.

Конструктор Account создаёт уникальную для каждого счёта информацию, записывая номер счёта и начальный баланс ( который приравнивается нулю, если при создании счёта не был задан другой баланс ). Затем увеличивается на единицу значение статического члена count, с помощью которого отслеживается количество существующих в данный момент объектов Account. Конструктор также инициализирует член node, который используется для объединения счетов в единый связанный список.

_________________

362 стр. . Великолепная десятка

«Для одного класса существует только одна копия каждого статического объекта. К ней имеют доступ все объекты класса.»

[]

Функции accountNo( ) и accountBalance( ) служат для того, чтобы предоставлять возможность считывания номера счёта и информации о балансе из внешнего мира, но не допускать непосредственного изменения этих значений.

Функции display( ) и type( ) придают всем счетам одинаковый формат отображения. Виртуальный метод type( ) будет переопределён в классах-наследниках. Так, метод Checking::type( ) вернёт строку "Чековый". Этот распространённый трюк позволяет методам базового класса, таким как Account::display( ), использовать точное описание класса.

Подкласс Checking класса Account достаточно прост. Конструктор класса Checking только передаёт аргументы конструктору класса Account. Единственная настоящая функция-член в этом классе — это withdrawal( ), которая реализует правила работы с чековыми счетами.

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

«Любой подкласс класса Account, который не переопределяет функцию type( ), будет абстрактным, и вы не сможете создать объект этого класса.»

[]

Функции, составляющие главную программу, теперь упрощены до предела. Функция getAccount( ) создаёт счёт класса Checking или Savings ( в зависимости от символа, введённого пользователем ). Это единственное место в программе, где происходит непосредственное обращение к подклассам класса Account.

Функция displayResults( ) проходит по связанному списку, опрашивая каждый объект Account для вывода информации о чековом или сберегательном счёте ( а также о других типах счетов, если таковые встретятся в дальнейшем ). Аналогично функция process(  ) выполняет вклады и снятия со счетов ( объектов Account ). Как именно выполняются эти действия — определяют сами счета.