Итоговый проект: каталог и склад
Чему вы научитесь:
- соединять в одном классе контейнер, строки и
const-методы; - писать методы, которые при отказе возвращают
falseи ничего не меняют; - менять элементы вектора в цикле по диапазону через ссылку;
- читать вывод проверок и начинать с первой непройденной.

Представьте библиотекаря за стойкой. Перед ним ящик с карточками книг, по одной карточке на книгу. Читатель приносит листок с номером книги. Библиотекарь находит её карточку и смотрит, нет ли на ней штампа «выдана». Если штамп уже стоит, он возвращает листок с отказом и ничего в ящике не трогает.
Класс в настоящей программе устроен так же: он хранит данные в контейнере, принимает запрос и проверяет, допустима ли операция. Аналогия расходится с кодом в одном: метод не объясняет причину отказа, он только возвращает false. Две задачи итогового проекта как раз такие: новых конструкций в них нет, вы соедините знакомые.
Две задачи
Каталог хранит книги — структуры Book с номером, названием, автором и отметкой о выдаче. Он находит книги автора, выдаёт книгу по номеру и принимает её обратно. Склад считает, сколько единиц каждого товара на нём лежит. Товаром может быть строка, число или значение другого типа, поэтому склад — шаблон класса.
| Задача | Что понадобится |
|---|---|
| Каталог книг | класс, const-методы, std::vector, std::string и std::string_view |
| Обобщённый склад | шаблон класса, const-метод, std::map |
Операцию бывает нельзя выполнить: выдать уже выданную книгу или забрать больше, чем есть. Тогда метод возвращает false и ничего не меняет.
Порядок работы
Начните с полей и метода add: без них остальным методам не с чем работать. Затем пишите по одному методу и после каждого запускайте тесты.
Тесты вызывают методы по очереди, и результат каждого вызова зависит от тех, что были до него. Поэтому начинайте с первой непройденной проверки: следующие часто не проходят из-за неё.
Как читать проверку
Пройденная проверка ничего не печатает. Непройденная печатает строку со значком ✗. Так заготовка склада отвечает на первую проверку:
✗ fruit.count("apple") == 8 got: -1Строка ✗ состоит из трёх частей:
- слева от
==— вызов из теста; - справа от
==— ожидаемое значение; - после
got:— то, что вернул ваш код.
Здесь -1 пришло из заготовки: метод count ещё не написан. Под строкой указаны файл с тестами и номер строки, где записана проверка.
Кроме таких строк, вы увидите ещё три вида сообщений:
- у проверки условия, например
✗ fruit.take("apple", 6), частиgot:нет: условие оказалось ложным, то естьtakeвернулfalse; - сводка «Пройдено n из m» показывает, сколько проверок прошло;
- если программа остановилась аварийно, строка «Во время проверки» назовёт проверку, на которой это случилось.
Частая ошибка
Цикл по диапазону должен изменить элементы вектора, но переменная цикла объявлена без &:
#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–3#include <iostream>, <vector>4struct Book {5 int id;6 bool lent = false;7};8 9int main() {10 std::vector<Book> books{{1}, {2}};11 for (Book book : books) {12 book.lent = true;13 }14 std::cout << books[0].lent << "\n";15 for (Book& book : books) {16 book.lent = true;17 }18 std::cout << books[0].lent << "\n";19}
Вектор из двух книг, обе не выданы
Главное
- Классы итогового проекта собраны из знакомых конструкций: контейнера, строк и
const-методов. - Метод, который отказывает, возвращает
falseи ничего не меняет. - Чтобы цикл по диапазону менял элементы, объявите переменную цикла ссылкой:
Book& book. - Начинайте с первой непройденной проверки: следующие часто не проходят из-за неё.
Подпишись, чтобы пройти курс
Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.