LoveRead.info » Книги » Разная литература » Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Книгу Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

292 0 18:03, 26-08-2023
Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
26 август 2023

Книга Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читать онлайн бесплатно без регистрации

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

    1 ... 159 160 161 162 163 164 165 166 167 ... 337
    Перейти на страницу:
    class="code">  ostringstream ss;

      ss << '(' << x << ',' << y << ')';

      xy_out.put(ss.str());

      redraw();

    }

    Все это совершенно очевидно. Функция get_int() позволяет получить целочисленные координаты из объектов класса In_box; поток ostringstream форматирует строки для вывода в объект класса Out_box; функция-член str() позволяет вставить строку в поток ostringstream. Финальная функция, redraw(), необходима для представления результатов пользователю; старое изображение остается на экране, пока не будет вызвана функция redraw() из класса Window.

    А что нового в этой программе? Посмотрим на ее функцию main().

    #include "GUI.h"

    int main()

    try {

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

      return gui_main();

    }

    catch(exception& e) {

      cerr << "Исключение: " << e.what() << 'n';

      return 1;

    }

    catch (...) {

      cerr << "Какое-то исключениеn";

      return 2;

    }

    Так ведь здесь, по существу, ничего нет! Тело функции main() содержит лишь определение нашего окна win и вызов функции gui_main(). Ни других функций, ни операторов if или switch, ни цикла — ничего из того, чтобы изучали в главах 6–7, — только определение переменной и вызов функции gui_main(), которая сама вызывает функцию run() из библиотеки FLTK. Изучая программу далее, увидим, что функция run() — это просто бесконечный цикл.

    while(wait());

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

    16.6. Инверсия управления

    А произошло вот что: мы передали поток управления от самой программы элементам управления окном: теперь программа возобновляет свою работу каждый раз, когда активизируется какой-нибудь из этих элементов. Например, щелкните на кнопке, и программа начнет работать. После возврата обратного вызова программа “отключается”, ожидая, пока пользователь сделает что-нибудь еще. По существу, функция wait() просит систему опросить элементы управления окном и активизировать соответствующие обратные вызовы. Теоретически функция wait() могла бы сообщать, какой элемент управления требует внимания, и предоставить самому программисту вызывать соответствующую функцию. Однако в библиотеке FLTK и в большинстве других систем графического пользовательского интерфейса функция wait() активизирует соответствующий обратный вызов, освобождая программиста от необходимости писать код для выбора этой функции.

    Обычная программа организована следующим образом:

    Программа графического пользовательского интерфейса организована иначе.

     

     Одна из сложностей такой инверсии управления проявляется в том, что порядок выполнения программы теперь полностью определяется действиями пользователя. Это усложняет как организацию, так и отладку программы. Трудно себе представить, что сделает пользователь, но еще труднее представить себе возможные результаты случайной последовательности обратных вызовов. Это превращает систематическое тестирование в ночной кошмар (подробнее об этом — в главе 26). Методы решения этой проблемы выходят за рамки рассмотрения нашей книги, но мы просим читателей быть особенно осторожными, работая с кодом, управляемым пользователями с помощью обратных вызовов. Кроме очевидных проблем с потоком управления, существуют проблемы, связанные с видимостью и отслеживанием связей между элементами управления окном и данными. Для того чтобы минимизировать трудности, очень важно не усложнять часть программы, отвечающую за графический пользовательский интерфейс, и создавать ее постепенно, тестируя каждую часть. Работая с программой графического пользовательского интерфейса, почти всегда необходимо рисовать небольшие диаграммы объектов и взаимодействия между ними.

    Как взаимодействуют части программы, активизированные разными обратными вызовами? Проще всего, чтобы функции оперировали данными, хранящимися в окне, как показано в примере из раздела 16.5. В нем функция next() класса Lines_window активизировалась щелчком на кнопке Next point, считывала данные из объектов класса In_box (next_x и next_y), а затем обновляла переменную-член lines и объект класса Out_box (xy_out). Очевидно, что функция, активизированная обратным вызовом, может делать все, что угодно: открывать файлы, связываться с сетью веб и т.д. Однако пока мы рассмотрим простой случай, когда данные хранятся в окне. 

    16.7. Добавление меню

    Исследуем вопросы управления и взаимодействия, поднятые в разделе “Инверсия управления”, на примере создания меню для программы, рисующей линии. Для начала опишем меню, позволяющее пользователю выбирать цвет всех линий в переменной lines. Добавим меню color_menu и обратные вызовы.

    struct Lines_window:Window {

      Lines_window(Point xy,int w,int h,const string& title);

      Open_polyline lines;

      Menu color_menu;

      static void cb_red(Address,Address);   // обратный вызов

                                             // для красной кнопки

      static void cb_blue(Address,Address);  // обратный вызов

                                             // для синей кнопки

      static void cb_black(Address,Address); // обратный вызов

                                             // для черной кнопки

      // действия:

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

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

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

      void change(Color c) { lines.set_color(c); }

      // ...как и прежде...

    };

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

    Определив член color_menu, мы должны его инициализировать.

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

          const string&title):Window(xy,w,h,title),

      // ...как и прежде...

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

      {

        // ...как и прежде...

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

    }

    Кнопки динамически связываются с меню (с помощью функции attach()) и при необходимости могут быть удалены и/или изменены. Функция Menu::attach() настраивает размер и место кнопки, а также связывает его с окном. Это все. Теперь мы увидим на экране следующее.

    Экспериментируя с этой программой, мы решили, что нам необходимо выпадающее меню; т.е. мы не хотим фиксировать конкретное место на экране, в котором оно будет появляться. Итак, мы добавили кнопку Color menu. Когда пользователь щелкнет на ней, всплывет меню цвета, а после того как выбора меню снова исчезнет, и на экране отобразится кнопка.

    Посмотрим сначала на окно, в которое добавлено несколько линий.

    Мы видим новую

    1 ... 159 160 161 162 163 164 165 166 167 ... 337
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

    Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


    Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

    • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
    • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
    • 3. Просьба отказаться от нецензурной лексики.
    • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

    Надеемся на Ваше понимание и благоразумие. С уважением, администратор LoveRead.info.


    Установить VPN и читай слушай бесплатно

    Новые отзывы

    1. Борис Борис14 июнь 00:50 Колокола в России тем и отличались от западных что раскачиаали именно язык колокола,а не сам колокол! Авторы что-жертвы ЕГЭ? Не... Соединенные Штаты России 3 - Полина Ром
    2. Людмила Хофман Людмила Хофман10 июнь 22:13 У меня перевернулся мир после прочтения ваших книг! Так приятно и чисто на душе, ведь по сути неважно кто с кем , а только любовь... Долгая игра - Рейчел Рид
    3. Анна Анна08 июнь 11:28 Спасибо за новую историю жизни и любви на сайте,прочитала с удовольствием .... Давай поженимся - Юлия Резник
    Все комметарии
    Новинки бесплатной онлайн библиотеки