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 ... 132 133 134 135 136 137 138 139 140 ... 337
    Перейти на страницу:
    рисуем замыкающую линию:

      if (color().visibility())

        fl_line(point(number_of_points()–1).x,

                point(number_of_points()–1).y,

                point(0).x,

                point(0).y);

    }

    В классе Closed_polyline нужна отдельная функция draw_lines(), рисующая замыкающую линию, которая соединяет последнюю точку с первой. К счастью, для этого достаточно реализовать небольшую деталь, которая отличает класс Closed_polyline от класса Shape. Этот важный прием иногда называют “программированием различий“ (“programming by difference”). Нам нужно запрограммировать лишь то, что отличает наш производный класс (Closed_polyline) от базового (Open_polyline).

    Итак, как же нарисовать замыкающую линию? Воспользуемся функцией fl_line() из библиотеки FLTK. Она получает четыре аргументы типа int, задающих четыре точки. И здесь нам снова понадобится графическая библиотека. Однако обратите внимание на то, что, как и во многих других ситуациях, упоминание библиотеки FLTK скрыто от пользователей. В программе пользователя нет никаких ссылок на функцию fl_line(), и ей неизвестно ничего о неявном представлении точек в виде пар целых чисел. При необходимости мы могли бы заменить библиотеку FLTK другой библиотекой графического пользовательского интерфейса, а пользователи этого почти не заметили бы.

    13.8. Класс Polygon

    Класс Polygon очень похож на класс Closed_polyline. Единственная разница состоит в том, что в классе Polygon линии не могут пересекаться. Например, объект класса Closed_polyline, изображенный выше, был многоугольником, но если к нему добавить еще одну точку, то ситуация изменится.

    cpl.add(Point(100,250));

    Результат изображен ниже.

    В соответствии с классическими определениями объект класса Closed_polyline многоугольником не является. Как определить класс Polygon так, чтобы он правильно отображал связь с классом Closed_polyline, не нарушая правил геометрии? Подсказка содержится в предыдущем описании. Класс Polygon — это класс Closed_polyline, в котором линии не пересекаются. Иначе говоря, мы могли бы подчеркнуть способ образования фигуры из точек и сказать, что класс Polygon — это класс Closed_polyline, в который невозможно добавить объект класса Point, определяющий отрезок линии, пересекающийся с одной из существующих линий в объекте класса Polygon.

    Эта идея позволяет описать класс Polygon следующим образом:

    struct Polygon:Closed_polyline { // замкнутая последовательность

                                     // непересекающихся линий

      void add(Point p);

      void draw_lines() const;

    };

    void Polygon::add(Point p)

    {

      // проверка того, что новая линия не пересекает существующие

      // (код скрыт)

      Closed_polyline::add(p);

    }

    Здесь мы унаследовали определение функции draw_lines() из класса Closed_polyline, сэкономив усилия и избежав дублирования кода. К сожалению, мы должны проверить каждый вызов функции add(). Это приводит нас к неэффективному алгоритму, сложность которого оценивается как N в квадрате, — определение объекта класса Polygon, состоящего из N точек, требует N*(N–1)/2 вызовов функции intersect(). По существу, мы сделали предположение, что класс Polygon будет использоваться для создания многоугольников с меньшим количеством точек.

     Например, для того чтобы создать объект класса Polygon, состоящего из 24 точек, потребуется 24*(24–1)/2 == 276 вызовов функции intersect(). Вероятно, это допустимо, но если бы мы захотели создать многоугольник, состоящий из 2000 точек, то вынуждены были бы сделать около 2 000 000 вызовов. Мы должны поискать более эффективный алгоритм, который может вынудить нас модифицировать интерфейс.

    В любом случае можем создать следующий многоугольник:

    Polygon poly;

    poly.add(Point(100,100));

    poly.add(Point(150,200));

    poly.add(Point(250,250));

    poly.add(Point(300,200));

    Очевидно, что этот фрагмент создает объект класса Polygon, идентичный (вплоть до последнего пикселя) исходному объекту класса Closed_polyline.

    Проверка того, что объект класса Polygon действительно представляет собой многоугольник, оказывается на удивление запутанной. Проверка пересечений, которая реализована в функции Polygon::add(), является наиболее сложной во всей графической библиотеке. Если вас интересуют кропотливые геометрические манипуляции с координатами, взгляните на код. И это еще не все. Посмотрим, что произойдет, когда мы попытаемся создать объект класса Polygon лишь из двух точек. Лучше предусмотреть защиту от таких попыток.

    void Polygon::draw_lines() const

    {

      if (number_of_points() < 3)

        error("Меньше трех точек вводить нельзя.");

      Closed_polyline::draw_lines();}

     

     Проблема заключается в том, что инвариант класса Polygon — “точки образуют многоугольник” — невозможно проверить, пока не будут определены все точки. Иначе говоря, в соответствии с настоятельными рекомендациями мы не задаем проверку инварианта в конструкторе класса Polygon. И все же “предупреждение о трех точках” в классе Polygon::draw_lines() — совершенно недопустимый трюк. (См. также упр. 18.) 

    13.9. Класс Rectangle

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

    struct Rectangle:Shape {

      Rectangle(Point xy, int ww, int hh);

      Rectangle(Point x, Point y);

      void draw_lines() const;

      int height() const { return h; }

      int width() const { return w; }

    private:

      int h; // высота

      int w; // ширина

    };

    Мы можем задать прямоугольник двумя точками (левой верхней и правой нижней) или одной точкой, шириной и высотой. Конструкторы этого класса могут иметь следующий вид:

    Rectangle::Rectangle(Point xy,int ww,int hh):w(ww),h(hh)

    {

      if (h<=0 || w<=0)

        error("Ошибка: отрицательная величина");

      add(xy);

    }

    Rectangle::Rectangle(Point x,Point y):w(y.x–x.x),h(y.y–x.y)

    {

      if (h<=0 || w<=0)

        error("Ошибка: отрицательная ширина или длина.");

      add(x);

    }

    Каждый конструктор соответствующим образом инициализирует члены h и w (используя синтаксис списка инициализации; см. раздел 9.4.4) и хранит верхнюю левую точку отдельно в базовом классе Shape (используя функцию add()). Кроме того, в конструкторах содержится проверка ширины и длины — они не должны быть отрицательными.

     

     Одна из причин, по которым некоторые системы графики и графического пользовательского интерфейса рассматривают прямоугольники как отдельные фигуры, заключается в том, что алгоритм определения того, какие
    1 ... 132 133 134 135 136 137 138 139 140 ... 337
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

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


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

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

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


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

    Новые отзывы

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