Читаем Программирование полностью

5. Определите класс Int, содержащий единственный член типа int. Определите конструкторы, оператор присваивания и операторы +, , * и /. Протестируйте этот класс и при необходимости уточните его структуру (например, определите операторы << и >> для обычного ввода-вывода).

6. Повторите предыдущее упражнение с классом Number, где T — любой числовой тип. Попытайте добавить в класс Number оператор % и посмотрите, что получится, когда вы попробуете применить оператор % к типам Number и Number.

7. Примените решение упр. 2 к нескольким объектам типа Number.

8. Реализуйте распределитель памяти (см. раздел 19.3.6), используя функции malloc() и free() (раздел Б.10.4). Создайте класс vector так, как описано в конце раздела 19.4, для работы с несколькими тестовыми примерами.

9. Повторите реализацию функции vector::operator=() (см. раздел 19.2.5), используя класс allocator (см. раздел 19.3.6) для управления памятью.

10. Реализуйте простой класс auto_ptr, содержащий только конструктор, деструктор, операторы –> и *, а также функцию release(). В частности, не пытайтесь реализовать присваивание или копирующий конструктор.

11. Разработайте и реализуйте класс counted_ptr, владеющий указателем на объект типа T, и указатель, подсчитывающий количество ссылок (переменная типа int), общий для всех указателей, с подсчетом ссылок на один и тот же объект типа T. Счетчик ссылок должен содержать количество указателей, ссылающихся на данный объект типа T. Конструктор класса counted_ptr должен размещать в свободной памяти объект типа T и счетчик ссылок. Присвойте объекту класса counted_ptr начальное значение типа T. После уничтожения последнего объекта класса counted_ptr для класса T его деструктор должен удалить объект класса T. Предусмотрите в классе counted_ptr операции, позволяющие использовать его как указатель. Это пример так называемого “интеллектуального указателя”, который используется для того, чтобы гарантировать, что объект не будет уничтожен, пока последний пользователь не прекратит на него ссылаться. Напишите набор тестов для класса counted_ptr, используя его объекты в качестве аргументов при вызове функций, в качестве элементов контейнера и т.д.

12. Определите класс File_handle, конструктор которого получает аргумент типа string (имя файла) и открывает файл, а деструктор закрывает файл.

13. Напишите класс Tracer, в котором конструктор вводит, а деструктор выводит строки. Аргументами конструктора должны быть строки. Используйте этот пример для демонстрации того, как работают объекты, соответствующие принципу RAII (например, поэкспериментируйте с объектами класса Tracer, играющими роль локальных объектов, объектов-членов класса, глобальных объектов, объектов, размещенных с помощью оператора new, и т.д.). Затем добавьте копирующий конструктор и копирующее присваивание, чтобы можно было увидеть поведение объектов класса Tracer в процессе копирования.

14. Разработайте графический пользовательский интерфейс и средства вывода для игры “Охота на Вампуса” (см. главу 18). Предусмотрите ввод данных из окна редактирования и выведите на экран карту части пещеры, известной игроку.

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

16. Иногда желательно, чтобы пустой вектор был как можно более маленьким. Например, можно интенсивно использовать класс vector>>, в котором большинство векторов пусто. Определите вектор так, чтобы выполнялось условие sizeof(vector)==sizeof(int*), т.е. чтобы класс вектора состоял только из указателя на массив элементов, количества элементов и указателя space.

Послесловие

Шаблоны и исключения представляют собой весьма мощные языковые конструкции. Они поддерживают весьма гибкие технологии программирования — в основном благодаря разделению ответственности, т.е. возможности решать по одной проблеме в каждый отдельный момент времени. Например, используя шаблоны, мы можем определить контейнер, такой как vector, отделив его от определения типа элементов. Аналогично можно написать код, идентифицирующий ошибки и выдающий сообщения о них, отдельно от кода, предназначенного для их обработки. Третья основная тема, связанная с изменением размера вектора, относительно проста: функции push_back(), resize() и reserve() позволяют отделить определение вектора от спецификации его размера.

<p id="AutBody_Root369"><strong>Глава 20</strong></p><p>Контейнеры и итераторы</p>

“Пишите программы, которые делают что-то одно

и делают это хорошо. Пишите программы,

чтобы работать вместе”.

Дуг Мак-Илрой (Doug McIlroy)

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных