Итоги — Менеджер банковских счетов
Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy. Урок 33 из 104.
Задание
ЛегкоДавайте создадим полноценный менеджер банковских счетов Bank Account Manager, который объединяет все изученные в этой главе концепции свойств класса: закрытые члены с геттерами и сеттерами, const-функции-члены, изменяемые члены, статические переменные и методы, а также дружественные функции.
Вы создадите два файла, чтобы организовать свой код:
BankAccount.h: Define классBankAccount, который управляет данными счета с правильной инкапсуляцией. Ваш класс должен содержать:- Закрытые члены:
accountNumber(строка),ownerName(строка),balance(double) иmutable int queryCountдля отслеживания количества проверок баланса - Закрытый статический член
totalAccountsдля отслеживания количества существующих счетов - Конструктор, принимающий номер счета, имя владельца и начальный баланс. Он должен инициализировать
queryCountзначением0и увеличиватьtotalAccounts - Константные геттеры:
getAccountNumber(),getOwnerName()иgetBalance(): геттер баланса должен увеличиватьqueryCountпри каждом вызове - Константный геттер
getQueryCount(), возвращающий количество проверок баланса - Метод
deposit(double amount), который добавляет сумму к балансу только в том случае, если сумма положительна - Метод
withdraw(double amount), который вычитает сумму из баланса только в том случае, если сумма положительна и не превышает текущий баланс - Статический метод
getTotalAccounts(), возвращающий общее количество созданных счетов - Declare дружественную функцию
transfer(BankAccount& from, BankAccount& to, double amount), которая переводит деньги между счетами. Она должна выполнять перевод только в том случае, если сумма положительна, а на исходном счете достаточно средств
Define статический член и дружественную функцию после определения класса.
- Закрытые члены:
main.cpp: Продемонстрируйте совместную работу всех этих возможностей. Считайте из входных данных два имени владельцев и два начальных баланса (всего четыре строки: name1, balance1, name2, balance2), затем:- Create два объекта
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>"для первого счета
- Create два объекта
Форматируйте все значения баланса с двумя десятичными знаками, используя 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: Print "Total accounts: <count>"
// TODO: Вывести "<name>: $<balance>" для первого счёта
// TODO: Вывести "<name>: $<balance>" для второго счёта
// TODO: Внести 500.0 на первый счёт
// TODO: Print "After deposit - <name>: $<balance>" for the first account
// TODO: Перевести 300.0 с первого счёта на второй, используя friend-функцию
// TODO: Print "After transfer:"
// TODO: Вывести " <name>: $<balance>" для первого счёта (обратите внимание на отступ в 2 пробела)
// TODO: Вывести " <name>: $<balance>" для второго счёта (обратите внимание на отступ в 2 пробела)
// TODO: Print "Query count for <name>: <count>" for the first account
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++