Чтение онлайн

на главную

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

Мы поместили вектор

points
объектов класса
Point
в раздел
private
, чтобы защитить его от нежелательных изменений. Для того чтобы он был полезным, мы должны обеспечить доступ к нему.

void Shape::set_point(int i, Point p) // не используется

{

points[i] = p;

}

Point Shape::point(int i) const

{

return points[i];

}

int Shape::number_of_points const

{

return points.size;

}

В

производном классе эти функции используются так:

void Lines::draw_lines const

// рисует линии, соединяющие пары точек

{

for (int i=1; i<number_of_points; i+=2)

fl_line(point(i–1).x,point(i–1).y,point(i).x,point(i).y);

}

Все эти тривиальные функции доступа могут вызвать у вас обеспокоенность. Эффективны ли они? Не замедляют ли работу программы? Увеличивают ли они размер генерируемого кода? Нет, компилятор всех их делает подставляемыми. Вызов функции
number_of_points
занимает столько же байтов памяти и выполняет точно столько же инструкций, сколько и непосредственный вызов функции
points.size
.

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

Shape
.

struct Shape { // слишком простое определение — не используется

Shape;

void draw const; // работает с цветом и вызывает функцию

// draw_lines

virtual void draw_lines const; // рисует линии

virtual void move(int dx, int dy); // перемещает фигуры +=dx

// и +=dy

vector<Point> points; // не используется всеми фигурами

Color lcolor;

Line_style ls;

Color fcolor;

}

Какие возможности обеспечивают эти двенадцать дополнительных функций-членов и два канала доступа к спецификациям (
private:
и
protected:
)? Главный ответ состоит в том, что защита класса от нежелательного изменения позволяет разработчику создавать лучшие классы с меньшими усилиями. Этот же аргумент относится и к инвариантам (см. раздел 9.4.3). Подчеркнем эти преимущества на примере определения классов, производных от класса
Shape
. В более
ранних вариантах класса
Shape
мы использовали следующие переменные:

Fl_Color lcolor;

int line_style;

Оказывается, это очень ограничивает наши возможности (стиль линии, задаваемый переменной типа

int
, не позволяет элегантно задавать ширину линии, а класс
Fl_Color
не предусматривает невидимые линии) и приводит к довольно запутанному коду. Если бы эти две переменные были открытыми и использовались в пользовательской программе, то мы могли бы улучшить интерфейсную библиотеку только за счет взлома этого кода (поскольку в нем упоминаются имена
lcolor
и
line_style
).

Кроме того, функции доступа часто обеспечивают удобство обозначений. Например, инструкция
s.add(p)
читается и записывается легче, чем
s.points.push_back(p)
.

14.2.3. Рисование фигур

Мы описали почти все, кроме ядра класса

Shape
.

void draw const; // работает с цветом и вызывает функцию

// draw_lines

virtual void draw_lines const; // рисует линии

Основная задача класса

Shape
— рисовать фигуры. Мы не можем удалить из класса
Shape
все остальные функции и оставить его вообще без данных о нем самом, не нанеся вреда нашей основной концепции (см. раздел 14.4); рисование — это главная задача класса
Shape
. Он выполняет ее с помощью библиотеки FLTK и операционной системы, но с точки зрения пользователя он выполнят только две функции.

• Функция

draw
интерпретирует стиль и цвет, а затем вызывает функцию
draw_lines
.

• Функция

draw_lines
подсвечивает пиксели на экране.

Функция

draw
не использует никаких новаторских методов. Она просто вызывает функции библиотеки FLTK, чтобы задать цвет и стиль фигуры, вызывает функцию
draw_lines
, чтобы выполнить реальное рисование на экране, а затем пытается восстановить цвет и фигуру, заданные до ее вызова.

void Shape::draw const

{

Fl_Color oldc = fl_color;

// универсального способа идентифицировать текущий стиль

// не существует

fl_color(lcolor.as_int); // задаем цвет

fl_line_style(ls.style,ls.width); // задаем стиль

draw_lines;

fl_color(oldc); // восстанавливаем цвет (предыдущий)

fl_line_style(0); // восстанавливаем стиль линии (заданный

Поделиться:
Популярные книги

Кодекс Охотника. Книга XXIV

Винокуров Юрий
24. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXIV

Последний попаданец

Зубов Константин
1. Последний попаданец
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Последний попаданец

Восход. Солнцев. Книга IX

Скабер Артемий
9. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга IX

Система Возвышения. Второй Том. Часть 1

Раздоров Николай
2. Система Возвышения
Фантастика:
фэнтези
7.92
рейтинг книги
Система Возвышения. Второй Том. Часть 1

Вторая невеста Драконьего Лорда. Дилогия

Огненная Любовь
Вторая невеста Драконьего Лорда
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Вторая невеста Драконьего Лорда. Дилогия

Последний Паладин. Том 8

Саваровский Роман
8. Путь Паладина
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Последний Паладин. Том 8

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

Война

Валериев Игорь
7. Ермак
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Война

В ожидании осени 1977

Арх Максим
2. Регрессор в СССР
Фантастика:
альтернативная история
7.00
рейтинг книги
В ожидании осени 1977

Кровь, золото и помидоры

Распопов Дмитрий Викторович
4. Венецианский купец
Фантастика:
альтернативная история
5.40
рейтинг книги
Кровь, золото и помидоры

Последний реанорец. Том I и Том II

Павлов Вел
1. Высшая Речь
Фантастика:
фэнтези
7.62
рейтинг книги
Последний реанорец. Том I и Том II

Кодекс Охотника. Книга III

Винокуров Юрий
3. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Кодекс Охотника. Книга III

Помещица Бедная Лиза

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Помещица Бедная Лиза

Цеховик. Книга 1. Отрицание

Ромов Дмитрий
1. Цеховик
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Цеховик. Книга 1. Отрицание