Не все функции-элементы необходимо делать открытыми как часть интерфейса класса. Некоторые функции-элементы оставляются закрытыми и служат обслуживающими функциями-утилитами для других функций класса.
Замечание по технике программирования 6.15
Функции-элементы можно разбить на ряд категорий: функции, которые читают и возвращают значения закрытых данных-элементов; функции, которые устанавливают значения закрытых данных-элементов; функции, которые реализуют возможности класса; функции, которые выполняют для класса различные вспомогательные операции, такие, как задание начальных значений объектам класса, присваивания объектам класса, преобразования между классами и встроенными типами или между классами и другими классами, выделение памяти для объектов класса.
Функции доступа могут читать или отображать данные. Другим типичным применением функций доступа является проверка истинности или ложности условий — такие функции часто называют предикатными функциями. Примером предикатной функции могла бы быть функция isEmpty для любого класса контейнера — класса, способного содержать внутри себя много объектов, например, связного списка, стека или очереди. Программа проверяла бы функцию isEmpty прежде, чем пытаться прочесть очередной элемент из объекта контейнера. Предикатная функция isFull могла бы проверять объект класса контейнер, чтобы выяснить, имеется ли в нем дополнительное пространство.
Рис. 6.7 демонстрирует запись функции-утилиты. Функция-утилита не является частью интерфейса класса. Она является закрытой функцией-эле- ментом, которая поддерживает работу открытых функций-элементов класса. Функции-утилиты не предназначены для использования клиентами класса.
Класс Salesperson имеет массив, содержащий 12 сведений о месячных продажах, которым с помощью конструктора присвоены нулевые начальные значения и которым значения, задаваемые пользователем, устанавливаются с помощью функции setSales. Открытая функция-элемент printAnnualSales печатает сумму продаж за последние 12 месяцев. Функция-утилита totalАп- nuaiSales суммирует сведения о продажах за 12 месяцев, обеспечивая работу printAnnualSales. Функция-элемент printAnnualSales редактирует сведения о продажах и переводит их в формат суммы долларов.
// SALESP.H
// Определение класса Salesperson . // Функции-элементы, описаны в SALESP.CPP
■ ? L L'ndef SALESP_H
■ " #define SALESP H v v —
class Salesperson { public:
tl , Salesperson () ; // конструктор
void setSales (int, double); // Установка введенных
// пользователем сведений
// о продажах за один месяц.
void printAnnualSales ();
private:
double sales[12]; //сведения о продажах за 12 месяцев
double totalAnnualSales(); //функция-утилита
} ;
#endif
Рис. 6.7. Использование функции-утилиты (часть! из 3)
// SALESP.CPP
// Функции-элементы класса Salesperson iinclude iinclude iinclude "salesp.h"
// Функция конструктор присваивает начальные значения массиву
Salesperson::Salesperson() {
for (int i = 0; i < 12; i++) sales[ i ] = 0.0;
}
// Функция установки сведений о продажах за 1 из 12 месяцев
void Salesperson::setSales(int month, double amount) {
if (month >= 1 && month <= 12 && amount > 0)
•we * ■( |
sales[month - 1] = amount; else
cout << "Ошибочный месяц или сведения о продажах" << endl;
// Закрытая функция-утилита для суммирования продаж за год double Salesperson::totalAnnualSales() (
double total = 0.0;
for (int i = 0; i < 12; i++) total += sales [ i ];
return total;
}
// Печать суммы годовых продаж
void Salesperson::printAnnualSales() {
cout « setprecision(2)
:showpoint) |
<< setiosflags(ios::fixed | ios: << endl << "Сумма продаж за год: « totalAnnualSales () « endl;
}
Рис. 6.7. Использование функции-утилиты (часть2 из 3) // FIG6_7.CPP
// Демонстрация функции-утилиты // Компиляция совместно с SALESP.СРР #include <iostream.h> ttinclude "salesp.h"
main() {
Salesperson s; //создание объекта s класса Salesperson
double salesFigure;
for (int i = 1; i <= 12; i++) {
cout « "Введите объем продаж за месяц " « i «": "; cin >> salesFigure; s . setSales(i, salesFigure);
}
s.printAnnualSales() ;
return 0;
}
Введите | объем | продаж | sa | месяц | 1: | 5314. | 76 |
Введите | объем | продаж | за | месяц | 2: | 4292. | 38 |
Введите | объем | продаж | за | месяц | 3: | 4589. | 83 |
Введите | объем | продаж | за | месяц | 4 : | 5534. | 03 |
Введите | объем | продаж | за | месяц | 5: | 4376. | 34 |
Введите | объем | продаж | за | месяц | 6: | 5698. | 45 |
Введите | объем | продаж | за | месяц | 7: | 4439. | 22 |
Введите | объем | продаж | за | месяц | 8: | 5893. | 57 |
Введите | объем | продаж | за | месяц | 9: | 4909. | 67 |
Введите | объем | продаж | за | месяц | 10: | : 5123 | .45 |
Введите | объем | продаж | за | месяц | 11: | : 4024 | .97 |
Введите | объем | продаж | за | месяц | 12: | : 5923 | .92 |
Сумма продгик за год: | $60120.59 | | |
Комментариев нет:
Отправить комментарий