Получение баланса
Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 26 из 61.
Задание
ЛегкоВаша Bank Account почти готова! Вы создали возможность создавать аккаунты, вносить средства с помощью deposit и снимать деньги с помощью withdraw, но отсутствует одна важная часть. Сейчас внешний код никак не может увидеть текущий balance. Давайте исправим это, добавив getter-функцию.
Getter — это правильный способ предоставить доступ к скрытым данным в инкапсулированном модуле. Вместо того чтобы делать поле balance публичным (что нарушило бы инкапсуляцию), вы предоставляете функцию только для чтения, которая возвращает это значение. Так данные остаются защищёнными, а контролируемый доступ к ним сохраняется.
Вы продолжите работать с тремя файлами:
account.h: добавьте новый прототип функции:get_balance. Эта функция принимаетconst Account *(поскольку она только читает данные и никогда их не изменяет) и возвращает значение типаdouble, представляющее текущийbalance. Сохраните все существующие объявления.account.c: реализуйте функциюget_balance. Она просто возвращает скрытое полеbalanceизaccount. Обратите внимание: эта функция может обращаться к внутренним данным, поскольку определена в том же файле, что иstruct; внешний код по-прежнему не может напрямую заглянуть внутрь.main.c: теперь вы наконец можете увидеть, что происходит внутри ваших аккаунтов! Создайте аккаунт, выполните несколько операций и используйте новый getter, чтобы отображатьbalanceна каждом шаге.
Вы получите четыре входных значения: идентификатор account (целое число), сумму deposit, сумму withdrawal и сумму второго deposit.
В основном файле создайте аккаунт и выведите его initial balance (должен быть равен 0.00). Внесите первую сумму с помощью deposit и выведите новый balance. Снимите указанную сумму с помощью withdraw и снова выведите balance. Наконец, выполните второй deposit и выведите итоговый balance. Затем уничтожьте аккаунт.
Выведите результат в следующем формате:
Account 1001 created
Balance: 0.00
Balance: 500.00
Balance: 200.00
Balance: 350.00
Account destroyedЗдесь 1001 — это идентификатор account, а значения balance отражают: initial (0.00), значение after внесения 500.00, значение after снятия 300.00 и значение after внесения ещё 150.00. Форматируйте все значения balance с двумя знаками после десятичной точки, используя %.2f.
С этим getter ваш модуль Bank Account теперь предоставляет полный контролируемый доступ к данным аккаунта: пользователи могут видеть balance, но изменять его могут только через ваши проверенные функции deposit и withdraw.
Попробуйте сами
#include <stdio.h>
#include "account.h"
int main() {
int account_id;
scanf("%d", &account_id);
double deposit1;
scanf("%lf", &deposit1);
double withdraw_amount;
scanf("%lf", &withdraw_amount);
double deposit2;
scanf("%lf", &deposit2);
Account* account = create_account(account_id);
printf("Account %d created\n", account_id);
// TODO: Вывести начальный баланс с помощью get_balance
deposit(account, deposit1);
// TODO: Вывести баланс после первого депозита
withdraw(account, withdraw_amount);
// TODO: Вывести баланс после снятия
deposit(account, deposit2);
// TODO: Вывести баланс после второго депозита
destroy_account(account);
printf("Account destroyed\n");
return 0;
}Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C