Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Подкласс Checking класса Account достаточно прост. Конструктор класса Checking только передаёт аргументы конструктору класса Account . Единственная настоящая функция-член в этом классе — это withdrawal( ) , которая реализует правила работы с чековыми счетами.
Класс 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 .
/* AccountLinkedList — поддерживает связанный */
/* список объектов Account */
#include "AccountLinkedList.h"
namespace Lists
{
/* addNode — добавляет узел в начало текущего связанного списка */
void AccountLinkedList::addNode( Node* pNode )
{
pNode -> pNext = pHead ;
pHead = pNode ;
}
}
Оценка бюджета...365
Задача, решаемая программой BUDGET, очень проста. Тем не менее сравнение разных версий этой программы даёт вам представление об отличии чисто функционального программирования ( BUDGET1 ) от объектно-основанного ( BUDGET2 ) и объектно-ориентированного программирования ( BUDGET3 ).
Основная проблема программы BUDGET3 в том, что связанный список, который в ней реализован, в состоянии работать только с классом Account и никаким другим. Проделав такую работу по созданию связанного списка, вы, вероятно, захотите использовать его и в других программах — например, для хранения информации о студентах.
Программа BUDGET4 расширяет рамки применения класса LinkedList . Чтобы разобраться в том, как она это делает, вы должны сперва ознакомиться с материалом главы 27.
_________________
365 стр. Глава 31. Программа BUDGET
►BUDGET4...366
Программа BUDGET имитирует работу банка, позволяя вкладывать и снимать деньги со счёта. Пользователь вводит последовательность банковских счетов, причём для каждого счёта вводится серия вкладов на счёт и снятия денег со счёта. После того как будут введены все счета и все транзакции, программа выводит состояние всех счетов ( а также общий баланс по всем счетам ). В программах BUDGET2 и BUDGET3 имитируются два вида счетов — чековый и сберегательный. Чековый счёт отличается тем, что если на нём остаётся меньше 500 долларов, то за каждый обработанный чек удерживается 20 центов. Первое снятие со сберегательного счёта выполняется бесплатно, а каждое последующее обходится в 5 долларов, независимо от состояния счёта. Программа BUDGET2 использует для решения поставленной задачи функции, a BUDGET3 — объектно-ориентированные концепции из четвёртой части книги.
Читать дальшеИнтервал:
Закладка: