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

на главную - закладки

Жанры

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

Итак, в чем же проблема? Вот правильная версия (см. раздел 16.5).

int main

{

Lines_window win(Point(100,100),600,400,"lines");

return gui_main;

}

Мы забыли указать имя

win
объекта класса
Lines_window
. Поскольку на самом деле мы не используем это имя, это кажется разумным, но компилятор решит, что, поскольку вы не используете окно, его можно сразу удалить.
Ой! Это окно существовало всего несколько миллисекунд. Ничего удивительно, что мы его не заметили.

Другая распространенная проблема заключается в том, что окно располагается точно поверх другого окна. Это выглядит так, будто на экране открыто только одно окно. А куда делось другое? Мы можем долго искать несуществующие ошибки в своей программе. Та же самая проблема может возникнуть, если вы размещаете одну фигуру поверх другой.

И в заключение (чтобы еще больше огорчить читателей) отметим, что при работе с библиотеками графического пользовательского интерфейса исключения не всегда срабатывают так, как мы от них ожидаем. Поскольку наша программа управляется библиотекой графического пользовательского интерфейса, сгенерированное исключение может никогда не попасть к своему обработчику — библиотека или операционная система может “съесть” его (т.е. использовать механизмы обработки ошибок, отличающиеся от исключения языка С++).

К типичным проблемам, выявляемым при отладке, относится и отсутствие изображений объектов
Shape
и
Widget
из-за отсутствия связи с окном или неправильного поведения объекта. Однако их описание выходит за рамки нашей книги. Посмотрите, как программист может создать и связать кнопку с меню, породив проблемы.

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

void load_disaster_menu(Menu& m)

{

Point orig(0,0);

Button b1(orig,0,0,"flood",cb_flood);

Button b2(orig,0,0,"fire",cb_fire);

// ...

m.attach(b1);

m.attach(b2);

// ...

}

int main

{

// ...

Menu disasters(Point(100,100),60,20,Menu::horizontal,
"disasters");

load_disaster_menu(disasters);

win.attach(disasters);

// ...

}

Этот код не работает. Все кнопки являются локальными объектами в функции

load_disaster_menu
, и их связывание с меню не изменяет состояние самого меню.
Объяснение этого факта приведено в разделе 18.5.4, а размещение локальных переменных в памяти было проиллюстрировано в разделе 8.5.8. Дело в том, что после возврата управления из функции
load_disaster_menu
эти локальные объекты были уничтожены, и меню disasters ссылается на несуществующие (уничтоженные) объекты. Результат неожиданный и неприятный. Устранить эту ошибку можно, используя неименованные объекты, созданные оператором new, а не именованные локальные объекты.

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

void load_disaster_menu(Menu& m)

{

Point orig(0,0);

m.attach(new Button(orig,0,0,"flood",cb_flood));

m.attach(new Button(orig,0,0,"fire",cb_fire));

// ...

}

Правильное решение даже проще, чем ошибочный код (впрочем, очень широко распространенный).

Задание

1. Создайте совершенно новый проект, связав его с библиотекой FLTK1. (Установки редактора связей описаны в приложении Г.)

2. Используя средства, описанные в файле

Graph_lib
, выведите какой-нибудь текст в программе из раздела 16.5 и выполните ее.

3. Модифицируйте программу так, чтобы она использовала всплывающее меню, как описано в разделе 16.7, и выполните ее.

4. Измените программу так, чтобы в ней было второе меню для выбора стиля линий, и выполните ее.

Контрольные вопросы

1. Зачем нужен графический пользовательский интерфейс?

2. Когда нужен текстовый интерфейс?

3. Что такое уровень программного обеспечения?

4. Зачем нужны уровни программного обеспечения?

5. В чем заключается фундаментальная проблема взаимодействия с операционной системой с помощью языка C++?

6. Что такое обратный вызов?

7. Что такое виджет?

8. Как еще называют виджет?

9. Что означает аббревиатура FLTK?

10. Как читается аббревиатура FLTK?

11. О каких еще инструментах графического пользовательского интерфейса вы знаете?

12. Какие системы используют термин виджет, а какие — элемент управления окном?

13. Приведите примеры виджетов.

14. Когда используются окна редактирования для ввода?

15. Какие типы данных могут храниться в окнах редактирования для ввода?

16. Когда используется кнопка?

17. Когда используется меню?

18. Что такое инверсия управления?

19. Опишите основную стратегию отладки программ с графическим пользовательским интерфейсом.

20. Почему отладка программ с графическим пользовательским интерфейсом труднее, чем отладка обычной программы с потоками ввода-вывода?

Термины

Упражнения

1. Создайте класс

My_window
, похожий на класс
Simple_window
, за исключением того, что он имеет две кнопки: Next и Quit.

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

Пожиратель душ. Том 1, Том 2

Дорничев Дмитрий
1. Демон
Фантастика:
боевая фантастика
юмористическая фантастика
альтернативная история
5.90
рейтинг книги
Пожиратель душ. Том 1, Том 2

На границе империй. Том 4

INDIGO
4. Фортуна дама переменчивая
Фантастика:
космическая фантастика
6.00
рейтинг книги
На границе империй. Том 4

Ваше Сиятельство 2

Моури Эрли
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Ваше Сиятельство 2

Отверженный III: Вызов

Опсокополос Алексис
3. Отверженный
Фантастика:
фэнтези
альтернативная история
7.73
рейтинг книги
Отверженный III: Вызов

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

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

Приручитель женщин-монстров. Том 9

Дорничев Дмитрий
9. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 9

Возвышение Меркурия. Книга 5

Кронос Александр
5. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 5

Хозяйка лавандовой долины

Скор Элен
2. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Хозяйка лавандовой долины

Месть Паладина

Юллем Евгений
5. Псевдоним `Испанец`
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Месть Паладина

Наследник Четырех

Вяч Павел
5. Игра топа
Фантастика:
героическая фантастика
рпг
6.75
рейтинг книги
Наследник Четырех

Гром над Тверью

Машуков Тимур
1. Гром над миром
Фантастика:
боевая фантастика
5.89
рейтинг книги
Гром над Тверью

Стеллар. Заклинатель

Прокофьев Роман Юрьевич
3. Стеллар
Фантастика:
боевая фантастика
8.40
рейтинг книги
Стеллар. Заклинатель

Измена. Возвращение любви!

Леманн Анастасия
3. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Возвращение любви!

Я снова граф. Книга XI

Дрейк Сириус
11. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я снова граф. Книга XI