Нет ничего удивительного в том, что класс Simple_window
xy
), размер (w,h
) и заголовок (title
) классу Window
из библиотеки Graph_lib
для дальнейшей обработки. Далее конструктор инициализирует член next_button
координатами (Point(x_max()–70,0
); это где-то в области верхнего правого угла), размером (70,20
), меткой ("Next"
) и функцией обратного вызова (cb_next
). Первые четыре параметра совпадают с параметрами, которые мы использовали при описании класса Window
: мы задаем положение прямоугольника на экране и указываем его метку.В заключение вызываем функцию attach()
next_button
с классом Simple_window
; иначе говоря, сообщаем окну, что оно должно отобразить кнопку в указанном месте и сделать так, чтобы графический пользовательский интерфейс узнал о ней.Член button_pushed
next()
. Фактически здесь все является деталью реализации и, следовательно, должно быть объявлено в разделе private
. Игнорируя детали реализации, опишем класс в целом.struct Simple_window:Graph_lib::Window {
Simple_window(Point xy,int w,int h,const string& title );
void wait_for_button(); // простой цикл событий
// ...
};
Другими словами, пользователь может создать окно и ожидать, пока не произойдет щелчок на кнопке.
16.3.1. Функции обратного вызова
cb_next()
cb_next()
(cb_
— “callback”).Такое имя выбирается просто для того, чтобы мы помнили о предназначении этой функции, — ни язык, ни библиотека этого не требуют. Очевидно, что мы выбрали имя cb_next
cb_next
выглядит уродливым куском “шаблонов”. Перед демонстрацией ее кода посмотрим, что она делает. cb_next()
cb_next()
и адрес нашего объекта класса Simple_window
вниз через уровни программного обеспечения; затем какой-то код “где-то внизу” вызывает функцию cb_next()
, когда выполняется щелчок на кнопке Next.Система графического пользовательского интерфейса (и операционная система) может использоваться программами, написанными на разных языках, но они не могут навязывать всем пользователям стиль языка С++. В частности, ей ничего не известно о наших классах Simple_window
Button
. Фактически она вообще ничего не знает о классах и их членах. Тип, требуемый для обратного вызова функции, выбирается так, чтобы его можно было использовать на самых низких уровнях программирования, включая язык C и ассемблер. Функция обратного вызова не возвращает значений и принимает в качестве аргументов два адреса. Мы можем объявить функцию-член так, чтобы она подчинялась этим требованиям.static void cb_next(Address, Address); // обратный вызов для
// next_button