"color menu",cb_menu),
{
attach(next_button);
attach(quit_button);
attach(next_x);
attach(next_y);
attach(xy_out);
xy_out.put("нет точек");
color_menu.attach(new Button(Point(0,0),0,0,"red",cb_red));
color_menu.attach(new Button(Point(0,0),0,0,"blue",cb_blue));
color_menu.attach(new Button(Point(0,0),0,0,"black",cb_black));
attach(color_menu);
color_menu.hide();
attach(menu_button);
attach(lines);
}
Обратите внимание на то, что инициализация выполняется в порядке определения данных-членов. Это правильный порядок инициализации. Фактически инициализация членов всегда происходит в порядке их объявления. Некоторые компиляторы выдают предупреждения, если конструктор базового класса или члена нарушает этот порядок.
16.8. Отладка программы графического пользовательского интерфейса
После того как программа графического пользовательского интерфейса начнет работать, ее отладка будет довольно простой: что видите, то и получите. Однако иногда возникает трудный фрустрационный период перед появлением первой фигуры или элемента управления окном и даже перед появлением самого окна на экране. Протестируем функцию main()
.
int main()
{
Lines_window (Point(100,100),600,400,"lines");
return gui_main();
}
• Тщательно исследовать части программы (классы, функции, библиотеки).
• Упростить все добавления, понемногу увеличивая объем программы, начиная с простейшей версии и тщательно отслеживая строку за строкой.
• Проверить все установки редактора связей.
• Сравнить ее с уже работающей программой.
• Объяснить код другу.
Итак, в чем же проблема? Вот правильная версия (см. раздел 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()
{