Перейти к содержимому
Теория · Итоговый проект · урок 1 из 3

Итоговый проект: каталог и склад

Чему вы научитесь

Чему вы научитесь:

  • соединять в одном классе контейнер, строки и const-методы;
  • писать методы, которые при отказе возвращают false и ничего не меняют;
  • менять элементы вектора в цикле по диапазону через ссылку;
  • читать вывод проверок и начинать с первой непройденной.
Ящик картотеки: листок lend(2) ведёт к карточке со штампом lent и возвращается со штампом false

Представьте библиотекаря за стойкой. Перед ним ящик с карточками книг, по одной карточке на книгу. Читатель приносит листок с номером книги. Библиотекарь находит её карточку и смотрит, нет ли на ней штампа «выдана». Если штамп уже стоит, он возвращает листок с отказом и ничего в ящике не трогает.

Класс в настоящей программе устроен так же: он хранит данные в контейнере, принимает запрос и проверяет, допустима ли операция. Аналогия расходится с кодом в одном: метод не объясняет причину отказа, он только возвращает false. Две задачи итогового проекта как раз такие: новых конструкций в них нет, вы соедините знакомые.

Две задачи

Каталог хранит книги — структуры Book с номером, названием, автором и отметкой о выдаче. Он находит книги автора, выдаёт книгу по номеру и принимает её обратно. Склад считает, сколько единиц каждого товара на нём лежит. Товаром может быть строка, число или значение другого типа, поэтому склад — шаблон класса.

ЗадачаЧто понадобится
Каталог книгкласс, const-методы, std::vector, std::string и std::string_view
Обобщённый складшаблон класса, const-метод, std::map

Операцию бывает нельзя выполнить: выдать уже выданную книгу или забрать больше, чем есть. Тогда метод возвращает false и ничего не меняет.

Порядок работы

Начните с полей и метода add: без них остальным методам не с чем работать. Затем пишите по одному методу и после каждого запускайте тесты.

Тесты вызывают методы по очереди, и результат каждого вызова зависит от тех, что были до него. Поэтому начинайте с первой непройденной проверки: следующие часто не проходят из-за неё.

Как читать проверку

Пройденная проверка ничего не печатает. Непройденная печатает строку со значком ✗. Так заготовка склада отвечает на первую проверку:

TEXT
✗ fruit.count("apple") == 8   got: -1

Строка ✗ состоит из трёх частей:

  • слева от == — вызов из теста;
  • справа от == — ожидаемое значение;
  • после got: — то, что вернул ваш код.

Здесь -1 пришло из заготовки: метод count ещё не написан. Под строкой указаны файл с тестами и номер строки, где записана проверка.

Кроме таких строк, вы увидите ещё три вида сообщений:

  • у проверки условия, например ✗ fruit.take("apple", 6), части got: нет: условие оказалось ложным, то есть take вернул false;
  • сводка «Пройдено n из m» показывает, сколько проверок прошло;
  • если программа остановилась аварийно, строка «Во время проверки» назовёт проверку, на которой это случилось.

Частая ошибка

Цикл по диапазону должен изменить элементы вектора, но переменная цикла объявлена без &:

C++
#include <iostream>
#include <vector>

struct Book {
    int id;
    bool lent = false;
};

int main() {
    std::vector<Book> books{{1}, {2}};
    for (Book book : books) {  // ✗
        book.lent = true;
    }
    std::cout << books[0].lent << ' ' << books[1].lent << '\n';  // 0 0
}

Программа собирается и выводит 0 0: на каждой итерации book — копия элемента, и true получает копия. В каталоге такую ошибку покажут тесты: второй вызов lend для той же книги снова возвращает true.

Объявите переменную цикла ссылкой: for (Book& book : books). Тогда цикл изменит сами элементы, и программа выведет 1 1.

Нажимайте «Следующий шаг» и следите за books[0]: в первом цикле true достаётся копии book, во втором — самому элементу.

ВживуюКопия и ссылка в циклешаг 1 из 11 · рамок: 1

Вектор из двух книг, обе не выданы

Сравните book и books[0] после строки book.lent = true

Главное

  • Классы итогового проекта собраны из знакомых конструкций: контейнера, строк и const-методов.
  • Метод, который отказывает, возвращает false и ничего не меняет.
  • Чтобы цикл по диапазону менял элементы, объявите переменную цикла ссылкой: Book& book.
  • Начинайте с первой непройденной проверки: следующие часто не проходят из-за неё.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом