Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

// действия, инициирующие обратные вызовы:

void red_pressed { change(Color::red); hide_menu; }

void blue_pressed { change(Color::blue); hide_menu; }

void black_pressed { change(Color::black); hide_menu; }

void menu_pressed { menu_button.hide; color_menu.show; }

void next;

void quit;

// функции обратного вызова:

static void cb_red(Address, Address);

static void cb_blue(Address, Address);

static void cb_black(Address, Address);

static void cb_menu(Address, Address);

static void cb_next(Address, Address);

static void cb_quit(Address, Address);

};

Обратите внимание на то, что все члены, кроме конструкторов, являются закрытыми. В принципе этот класс и является программой. Все, что происходит, происходит с помощью обратных вызовов, поэтому никакого кода, кроме этого класса, не требуется. Мы упорядочили объявления, чтобы определение класса стало более удобочитаемым. Конструктор передает аргументы всем своим подобъектам и связывает их с окном.

Lines_window::Lines_window(Point xy,int w,int h,

const string&title)

:Window(xy,w,h,title),

next_button(Point(x_max–150,0),70,20,

"Next point", cb_next),

quit_button(Point(x_max–70,0),70,20,"Quit",cb_quit),

next_x(Point(x_max–310,0),50,20,"next x:"),

next_y(Point(x_max–210,0),50,20,"next y:"),

xy_out(Point(100,0),100,20,"current (x,y):")

color_menu(Point(x_max–70,30),70,20,Menu::vertical,"color"),

menu_button(Point(x_max–80,30),80,20,

"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;

}

Вы видите ошибку? Независимо от того, видите ли вы ее или нет, эту программу следует испытать; она компилируется и выполняется, но вместо линий на экране в лучшем случае появляется какое-то мерцание. Как найти ошибку в такой программе? Для этого можно сделать следующее.

• Тщательно исследовать части программы (классы, функции, библиотеки).

• Упростить все добавления, понемногу увеличивая объем программы, начиная с простейшей версии и тщательно отслеживая строку за строкой.

• Проверить все установки редактора связей.

• Сравнить ее с уже работающей программой.

• Объяснить код другу.

Среди всех этих предложений самым трудным является отслеживание выполнения кода. Если вы умеете работать с отладчиком программ, у вас есть шанс, но простая вставка операторов вывода в данном случае бесполезна — проблема заключается в том, что никакой вывод на экране не появится. Даже отладчики иногда испытывают проблемы, поскольку в компьютере несколько действий выполняется одновременно (многопоточность), так как ваша программа — не единственная программа, пытающаяся взаимодействовать с экраном. Главное — упростить код и систематически его исследовать.

  • Читать дальше
  • 1
  • ...
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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