Итоги — Менеджер банковских счетов
Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy. Урок 33 из 104.
Задание
ЛегкоДавайте создадим полноценный менеджер банковских счетов, который объединяет все изученные в этой главе понятия, связанные со свойствами классов: закрытые члены с геттерами и сеттерами, константные функции-члены, изменяемые члены, статические переменные и методы, а также функции-друзья.
Для организации кода вы создадите два файла:
BankAccount.h: Определите классBankAccount, который управляет данными счета с помощью надлежащей инкапсуляции. В классе должны быть:- Закрытые члены:
accountNumber(строка),ownerName(строка),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>: $<balance>"для первого счета - Выведите
"<name>: $<balance>"для второго счета - Внесите
500.0на первый счет - Выведите
"After deposit - <name>: $<balance>"для первого счета - Переведите
300.0с первого счета на второй с помощью функции-друга - Выведите
"After transfer:" - Выведите
" <name>: $<balance>"для первого счета - Выведите
" <name>: $<balance>"для второго счета - Выведите
"Query count for <name>: <count>"для первого счета
- Создайте два объекта
Форматируйте все значения баланса с двумя знаками после десятичной точки, используя std::fixed и std::setprecision(2) из <iomanip>. Преобразуйте значения баланса, введенные в виде строк, в числа типа double с помощью std::stod().
Не забудьте добавить защиту от повторного включения в заголовочный файл и подключить <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 с первого счёта на второй с помощью дружественной функции
// 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Итоги — Обобщенный контейнерПотренируйтесь самостоятельно: Онлайн-компилятор C++