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

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

Шрифт:

Г.5. Как тестировать, если не все работает

Создайте новый файл с расширением

.cpp
в новом проекте и введите следующий код. Он должен скомпилироваться без проблем.

#include <FL/Fl.h>

#include <FL/Fl_Box.h>

#include <FL/Fl_Window.h>

int main

{

Fl_Window window(200, 200, "Window title");

Fl_Box box(0,0,200,200,"Hey, I mean, Hello, World!");

window.show;

return Fl::run;

}

Если что-то не работает, выполните следующее.

• Если вы получили сообщение компилятора, утверждающее, что файл с расширением

.lib
невозможно найти, то, возможно, вы сделали что-то не так при инсталлировании библиотеки. Внимательно проверьте п. 3, в котором указан путь для сохранения библиотечных файлов
(.lib
) на вашем компьютере.

• Если вы получили сообщение компилятора, утверждающее, что файл с расширением

.h
невозможно открыть, значит, скорее всего, вы ошиблись при инсталлировании. Внимательно проверьте п. 3, в котором указан путь для сохранения заголовочных файлов (
.h
) на вашем компьютере.

• Если вы получили сообщение редактора связей, упоминающее о неразрешенных внешних ссылках, то проблема таится в свойствах проекта.

Если наши советы вам не помогли, зовите друга.

Приложение Д

Реализация графического пользовательского интерфейса

“Когда вы наконец поймете, что делаете,

то все пойдет правильно”

Билл Фэйрбэнк (Bill Fairbank)

В этом приложении представлена реализация обратных вызовов, а также классов

Window
,
Widget
и
Vector_ref
. В главе 16 мы не требовали от читателей знать об указателях и операторах приведения типа, поэтому вынесли подробные объяснения в приложение.

Д.1. Реализация обратных вызовов

Обратные вызовы реализованы следующим образом:

void Simple_window::cb_next(Address, Address addr)

// вызов функции Simple_window::next для окна,

// расположенного по адресу addr

{

reference_to<Simple_window>(addr).next;

}

Поскольку вы уже прочитали главу 17, то вам должно быть очевидно, что аргумент

Address
должен иметь тип
void*
. И, разумеется, функция
reference_to<Simple_window>(addr)
должна каким-то образом создавать ссылку на объект класса
Simple_window
из указателя
addr
, имеющего тип
void*
. Однако, если у вас нет опыта программирования, то ничто для вас не “очевидно” и не “разумеется”, пока вы не прочтете главу 17, поэтому рассмотрим и использование адресов подробнее.

Как описано в разделе A.17, язык C++ предлагает способ для указания имени типа. Рассмотрим пример.

typedef void* Address; // Address — это синоним типа void*

Это значит, что мы можем использовать имя

Address
вместо
void*
. В данном случае, используя имя
Address
, мы хотим подчеркнуть, что передаем адрес, и скрыть тот факт, что
void*
— это имя типа указателя на объект, тип которого неизвестен.

Итак, функция

cb_next
получает указатель типа
void*
с именем
addr
в качестве аргумента и — каким-то образом — немедленно преобразовывает его в ссылку
Simple_window&
:

reference_to<Simple_window>(addr)

Функция

reference_to
является шаблонной (раздел A.13).

template<class W>W& reference_to(Address pw)

// интерпретирует адрес как ссылку на объект класса W

{

return *static_cast<W*>(pw);

}

Здесь мы использовали шаблонную функцию, для того чтобы самостоятельно написать операции, действующие как приведение типа

void*
к типу
Simple_window&
. Это приведение типа
static_cast
описано в разделе 17.8.

Компилятор не имеет возможности проверить наши предположения о том, что аргумент

addr
ссылается на объект класса
Simple_window
, но правила языка требуют, чтобы компилятор в этом вопросе доверял программисту. К счастью, мы оказались правы. Об этом свидетельствует от факт, что система FLTK возвращает нам обратно указатель, который мы ей передавали. Поскольку, передавая указатель системе FLTK, мы знали его тип, можно использовать функцию
reference_to
, чтобы “получить его обратно”. Все это немного запутанно, не проходит проверку и не больше характерно для низкоуровневого программирования.

  • Читать дальше
  • 1
  • ...
  • 504
  • 505
  • 506
  • 507
  • 508
  • 509
  • 510
  • 511
  • 512
  • 513
  • 514
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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