Упражнение 1.21. Напишите программу, которая читает два объекта класса Sales_item
с одинаковыми ISBN и вычисляет их сумму.
Упражнение 1.22. Напишите программу, читающую несколько транзакций с одинаковым ISBN и отображающую сумму всех прочитанных транзакций.
1.5.2. Первый взгляд на функции-члены
Программа суммирования объектов класса Sales_item
должна проверять наличие у этих объектов одинаковых ISBN. Сделаем это так:
#include
#include "Sales_item.h"
int main() {
Sales_item item1, item2;
std::cin >> item1 >> item2;
//
//
if (item1.isbn() == item2.isbn()) {
std::cout << item1 + item2 << std::endl;
return 0; //
} else {
std::cerr << "Data must refer to same ISBN"
<< std::endl;
return -1; //
}
}
Различие между этой программой и предыдущей версией в операторе if
и его ветви else
. Даже не понимая смысла условия оператора if
, вполне можно понять, что делает эта программа. Если условие истинно, вывод будет, как прежде, и возвратится значение 0
, означающее успех. Если условие ложно, выполняется блок ветви else
, который выводит сообщение об ошибке и возвращает значение -1
.
Условие оператора if
вызывает isbn()
.
item1.isbn() == item2.isbn()
Функция-член — это функция, определенная в составе класса. Функции-члены называют также
Вызов функции-члена обычно происходит от имени объекта класса. Например, первый, левый, операнд оператора равенства использует .
) для указания на то, что имеется в виду "член isbn()
объекта по имени item1
".
item1.isbn
Точечный оператор применим только к объектам типа класса. Левый операнд должен быть объектом типа класса, а правый операнд — именем члена этого класса. Результатом точечного оператора является член класса, заданный правым операндом.
Точечный оператор обычно используется для доступа к функциям-членам при их вызове. Для вызова функции используется ()
). Оператор обращения — это пара круглых скобок, заключающих список isbn()
не получает аргументов.
item1.isbn()
Таким образом, это вызов функции isbn()
, являющейся членом объекта item1
класса Sales_item
. Эта функция возвращает ISBN, хранящийся в объекте item1
.
Правый операнд оператора равенства выполняется тем же способом: он возвращает ISBN, хранящийся в объекте item2
. Если ISBN совпадают, условие истинно, а в противном случае оно ложно.
Упражнение 1.23. Напишите программу, которая читает несколько транзакций и подсчитывает количество транзакций для каждого ISBN.
Упражнение 1.24. Проверьте предыдущую программу, введя несколько транзакций, представляющих несколько ISBN. Записи для каждого ISBN должны быть сгруппированы.
1.6. Программа для книжного магазина
Теперь все готово для решения проблемы книжного магазина: следует прочитать файл транзакций и создать отчет, где для каждой книги будет подсчитана общая выручка, средняя цена и количество проданных экземпляров. При этом подразумевается, что все транзакции для каждого ISBN вводятся группами.
Программа объединяет данные по каждому ISBN в переменной total
(всего). Каждая прочитанная транзакция будем сохранена во второй переменной, trans
. В противном случае значение объекта total
выводится на экран, а затем заменяется только что считанной транзакцией.
#include
#include "Sales_item.h"
int main() {
Sales_item total; //
//
//
//
if (std::cin >> total) {
Sales_item trans; //
//
while (std::cin >> trans) {
//
if (total.isbn() == trans.isbn())