Итоги — Менеджер банковских счетов
Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy — урок 33 из 104.
Задание
ЛегкоДавайте создадим полноценный менеджер банковских счетов, который объединит все концепции свойств классов, изученные вами в этой главе: приватные члены с геттерами и сеттерами, константные функции-члены, изменяемые (mutable) члены, статические переменные и методы, а также дружественные функции.
Вы создадите два файла для организации вашего кода:
BankAccount.h: Определите классBankAccount, который управляет данными счета с надлежащей инкапсуляцией. Ваш класс должен содержать:- Приватные члены:
accountNumber(string),ownerName(string),balance(double) иmutable int queryCountдля отслеживания того, сколько раз проверялся баланс - Приватный статический член
totalAccountsдля отслеживания общего количества существующих счетов - Конструктор, который принимает номер счета, имя владельца и начальный баланс. Он должен инициализировать
queryCountзначением0и увеличиватьtotalAccounts - Константные геттеры:
getAccountNumber(),getOwnerName()иgetBalance()— геттер баланса должен увеличиватьqueryCountпри каждом вызове - Константный геттер
getQueryCount(), который возвращает количество проверок баланса - Метод
deposit(double amount), который пополняет баланс только в том случае, если сумма положительна - Метод
withdraw(double amount), который списывает средства с баланса только в том случае, если сумма положительна и не превышает текущий баланс - Статический метод
getTotalAccounts(), который возвращает общее количество созданных счетов - Объявление дружественной функции
transfer(BankAccount& from, BankAccount& to, double amount), которая переводит деньги между счетами — перевод должен осуществляться только если сумма положительна и на исходном счете достаточно средств
Определите статический член и дружественную функцию после определения класса.
- Приватные члены:
main.cpp: Продемонстрируйте совместную работу всех этих функций. Считайте два имени владельцев и два начальных баланса из входных данных (всего четыре строки: name1, balance1, name2, balance2), затем:- Создайте два объекта
BankAccountс номерами счетов"ACC001"и"ACC002" - Выведите
"Total accounts: <count>" - Выведите
"<name>: "<name>: $<balance>"lt;balance>"для первого счета - Выведите
"<name>: "<name>: $<balance>"lt;balance>"для второго счета - Внесите
500.0на первый счет - Выведите
"After deposit - <name>: "After deposit - <name>: $<balance>"lt;balance>"для первого счета - Переведите
300.0с первого счета на второй, используя дружественную функцию - Выведите
"After transfer:" - Выведите
" <name>: " <name>: $<balance>"lt;balance>"для первого счета - Выведите
" <name>: " <name>: $<balance>"lt;balance>"для второго счета - Выведите
"Query count for <name>: <count>"для первого счета
- Создайте два объекта
Форматируйте все значения баланса с двумя знаками после запятой, используя std::fixed и std::setprecision(2) из <iomanip>. Преобразуйте входные данные баланса из строк в числа с плавающей точкой с помощью std::stod().
Не забудьте про guard-вставки (header guards) в заголовочном файле и подключение <string> и <iostream> там, где это необходимо.
Попробуйте сами
#include <iostream>
#include <string>
#include <iomanip>
#include "BankAccount.h"
int main() {
// Чтение входных данных
std::string name1, name2;
std::string balance1Str, balance2Str;
std::getline(std::cin, name1);
std::getline(std::cin, balance1Str);
std::getline(std::cin, name2);
std::getline(std::cin, balance2Str);
double balance1 = std::stod(balance1Str);
double balance2 = std::stod(balance2Str);
// Настройка форматирования вывода до 2 знаков после запятой
std::cout << std::fixed << std::setprecision(2);
// TODO: Создайте два объекта BankAccount с номерами счетов "ACC001" и "ACC002"
// TODO: Выведите "Total accounts: <count>"
// TODO: Выведите "<name>: $<balance>" для первого счета
// TODO: Выведите "<name>: $<balance>" для второго счета
// TODO: Внесите 500.0 на первый счет
// TODO: Выведите "After deposit - <name>: $<balance>" для первого счета
// TODO: Переведите 300.0 с первого счета на второй, используя дружественную функцию friend
// TODO: Выведите "After transfer:"
// TODO: Выведите " <name>: $<balance>" для первого счета (обратите внимание на отступ в 2 пробела)
// TODO: Выведите " <name>: $<balance>" для второго счета (обратите внимание на отступ в 2 пробела)
// TODO: Выведите "Query count for <name>: <count>" для первого счета
return 0;
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыСборка и компиляция C++Заголовочные файлы и файлы исходного кодаПространства имен и область видимостиВведение в ООП на C++Классы и объектыУказатель 'this'Методы (функции-члены)Атрибуты (члены данных)Основы конструкторов и деструкторовИтоги — Простой калькулятор4Свойства классов
Члены экземпляра против статическихГеттеры и сеттерыКонстантные функции-членыКлючевое слово mutableСтатические методы и переменныеДружественные функции и классыИтоги — Менеджер банковских счетов7Наследование
Основы наследованияУровни доступа при наследованииПорядок вызова конструкторов и деструкторовПереопределение методовВиртуальные функции и VTableМножественное наследованиеВиртуальное наследованиеИтоги — Иерархия сотрудников10Обзор STL
Обзор и философия STLКонтейнеры STLИтераторыАлгоритмы STLФункторы и лямбда-выраженияИтоги: частота слов13Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonFactory и Abstract FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy2Управление памятью
Стек и кучаУказатели и ссылкиДинамическая память (new/delete)Умные указатели в C++RAII в C++Итоги — Менеджер динамического массива5Инкапсуляция
Спецификаторы доступа в C++Спецификаторы доступа: подробный разборСокрытие данныхStruct против ClassВложенные и внутренние классыИтоги — Система учета студентов8Полиморфизм
Полиморфизм компиляции и времени выполненияПерегрузка функцийВиртуальные функции: повторениеЧистые виртуальные функцииАбстрактные классыПроектирование интерфейсов на C++Dynamic Casting и RTTIИтоги: Калькулятор фигур11Продвинутые концепции ООП
Композиция против наследованияМиксины через CRTPИдиома PimplСтирание типовEnum Classes и строгая типизацияОбработка исключений в ООППользовательские иерархии исключений14Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикRAII как паттерн3Конструкторы и деструкторы
Конструктор по умолчаниюПараметризованный конструкторКонструктор копированияКонструктор перемещенияСписки инициализации конструктораДелегирующие конструкторыГлубокое погружение в деструкторыПравило трех / пяти / нуляПовторение — класс String6Перегрузка операторов
Введение в перегрузку операторовПерегрузка арифметических операторовПерегрузка операторов сравненияОператоры потоковПерегрузка оператора присваиванияПерегрузка операторов [] и ()Операторы преобразования типовИтоги — класс Matrix9Шаблоны
Шаблоны функцийШаблоны классовСпециализация шаблоновВариативные шаблоныОсновы SFINAE и Type TraitsИтоги — Обобщенный контейнер