Выбрать главу

 Sales_item item1, item2;

 std::cin >> item1 >> item2;

 // сначала проверить, представляют ли объекты 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 вызывает функцию-член (member function) isbn().

item1.isbn() == item2.isbn()

Функция-член — это функция, определенная в составе класса. Функции-члены называют также методами (method) класса.

Вызов функции-члена обычно происходит от имени объекта класса. Например, первый, левый, операнд оператора равенства использует оператор точка (dot operator) (оператор .) для указания на то, что имеется в виду "член isbn() объекта по имени item1".

item1.isbn

Точечный оператор применим только к объектам типа класса. Левый операнд должен быть объектом типа класса, а правый операнд — именем члена этого класса. Результатом точечного оператора является член класса, заданный правым операндом.

Точечный оператор обычно используется для доступа к функциям-членам при их вызове. Для вызова функции используется оператор вызова (call operator) (оператор ()). Оператор обращения — это пара круглых скобок, заключающих список аргументов (argument), который может быть пуст. Функция- член isbn() не получает аргументов.

item1.isbn()

Таким образом, это вызов функции isbn(), являющейся членом объекта item1 класса Sales_item. Эта функция возвращает ISBN, хранящийся в объекте item1.

Правый операнд оператора равенства выполняется тем же способом: он возвращает ISBN, хранящийся в объекте item2. Если ISBN совпадают, условие истинно, а в противном случае оно ложно.

Упражнения раздела 1.5.2

Упражнение 1.23. Напишите программу, которая читает несколько транзакций и подсчитывает количество транзакций для каждого ISBN.

Упражнение 1.24. Проверьте предыдущую программу, введя несколько транзакций, представляющих несколько ISBN. Записи для каждого ISBN должны быть сгруппированы.

1.6. Программа для книжного магазина

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

Программа объединяет данные по каждому ISBN в переменной total (всего). Каждая прочитанная транзакция будем сохранена во второй переменной, trans. В противном случае значение объекта total выводится на экран, а затем заменяется только что считанной транзакцией.

#include <iostream>

#include "Sales_item.h"

int main() {

 Sales_item total; // переменная для хранения данных следующей

                   // транзакции

 // прочитать первую транзакцию и удостовериться в наличии данных

 // для обработки

 if (std::cin >> total) {

  Sales_item trans; // переменная для хранения текущей транзакции

  // читать и обработать остальные транзакции