Программирование >>  Структурное программирование 

1 ... 162 163 164 [ 165 ] 166 167 168 ... 342


7.8.2. Пример: абстрактный тип данных строка

С++ - намеренно ограниченный язык, обеспечивающий программиста только заготовками возможностей построения систем широкого профиля. Язык спроектирован так, чтобы минимизировать накладные расходы, связанные с производительностью. С++ подходит для проектирования как приложений, так и систем, а последнее накладывает чрезвычайные требования на эффективность программ. Конечно, можно было бы включить абстрактный тип данных строку в число встроенных типов данных С++. Вместо этого язык был спроектирован так, чтобы предоставить механизмы построения и реализации строковых абстрактных типов данных с помощью классов. Мы создадим свой собственный АТД строка в главе 8.

7.8.3. Пример: абстрактный тип данных очередь

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

Очередь представляет собой хороший пример абстрактного типа данных. Очередь предлагает своим клиентам четко определенное поведение. Клиенты ставят некие элементы в очередь по одному за раз, используя операцию поставить в очередь, и получают их по одному за раз по запросу, используя операцию исключить из очереди. В принципе очередь может быть бесконечно длинной. Реальная очередь, конечно, ограничена. Элементы возвращаются из очереди в соответствии с дисциплиной - первый вошел - первый вышел (first-in, first-out - FIFO), т.е. первый элемент, вставленный в очередь, первым же ее покидает.

Очередь скрывает внутреннее представление данных, которое как-то отражает процесс ожидания элементов в очереди. Она предлагает своим клиентам набор операций, а именно - поставить в очередь и исключить из очереди. Клиентам не надо обращать внимание на способ реализации очереди. Клиенты просто хотят работать с очередью как объявлено . Когда клиент ставит в очередь новый элемент, очередь должна принять этот элемент и разместить его внутри себя в какой-то структуре данных типа первый вошел - первый вышел. Когда клиент хочет получить следующий элемент из начала очереди, очередь должна взять этот элемент из внутреннего представления и выпустить его во внешний мир в соответствии с дисциплиной FIFO, т.е. элемент, который находился в очереди дольше всех, должен быть следующим, возвращенным очередной операцией исключить из очереди.

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



7.9. Классы контейнеры и итераторы

к наиболее популярным типам классов относятся классы, контейнеры (называемые также классы совокупностей), т.е. классы, спроектированные для хранения в них совокупностей объектов. Классы контейнеры обычно снабжены такими возможностями, как вставка, удаление, поиск, сортировка, проверка наличия элемента в классе и тому подобное. Массивы, стеки, очереди, связные списки - все это примеры классов контейнеров.

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

7.10. Размышления об объектах: использование композиции и динамического управления объектом

в модели лифта

в главах с 2 по 5 вы проектировали модель лифта, а в главе 6 начали программирование этой модели. На протяжении главы 7 мы обсуждали методы, необходимые для завершения полной рабочей модели лифта. В частности, мы обсудили методику динамического управления объектами, которая позволяет использовать new и delete для создания и уничтожения объектов, необходимых для функционирования модели лифта. Мы обсудили также композицию, которая позволяет создавать классы, содержащие в качестве элементов другие классы. Композиция позволяет вам создать класс здание, который содержит лифт и этажи, и, в свою очередь, создать класс лифт, который содержит кнопки.

Лабораторное задание 6 по лифту

1. Каждый раз, когда в модели появляется очередной пассажир, вы должны использовать new, чтобы создать представляющий его объект Пассажир. Заметим, что new активизирует конструктор создаваемого объекта и, конечно, конструктор должен задать объекту соответствующие начальные значения. Каждый раз, когда пассажир покидает модель (после выхода из лифта), вы должны использовать delete, чтобы уничтожить объект пассажира и восстановить память, занятую этим объектом.

2. Перечислите отношения композиции между классами, которые вы реализовали для вашей модели лифта. Модифицируйте описания классов, которые вы создали в разделе Размышления об объектах в главе 6, чтобы отразить эти отношения композиции.



Глава 7

3. Завершите реализацию работающей моделирующей программы. В последующих главах мы подскажем, как расширить модель лифта.

Резюме

Ключевое слово const указывает, что объект константный - его нельзя изменять.

Компилятор C-f-f- не позволяет вызывать неконстантную функцию-элемент константного объект.

Функция указывается как const и в ее объявлении, и в ее описании.

Константная функция-элемент может быть перегружена неконстантным вариантом. Выбор того, какая из перегруженных функций-элементов будет использоваться, осуществляется компилятором автоматически в зависимости от того, был объявлен объект как const или нет.

Константный объект должен получить начальные значения в своем объявлении.

Если класс содержит константные данные-элементы, конструктор этого класса должен быть обеспечен инициализаторами элементов.

Классы могут быть композицией объектов других классов.

Объекты-элементы создаются в том порядке, в котором они объявлены, и до того, как будут созданы объекты включающего их класса.

Если объект-элемент не имеет инициализатора элементов, вызывается конструктор объекта-элемента с умолчанием.

Дружественная функция класса - это функция, определенная вне класса, но имеющая право доступа к элементам класса, объявленным как private и protected.

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

Каждая перегруженная функция, предназначенная быть другом, должна быть явно объявлена как друг класса.

Каждый объект поддерживает указатель на самого себя, называемый указателем this, который является неявным аргументом во всех ссылках на элементы внутри этого объекта. Указатель this неявно используется при ссылках и на функции-элементы, и на данные-элементы объекта.

Каждый объект может определить свой собственный адрес путем использования ключевого слова this.

Указатель this можно использовать явно, но чаще он используется неявно.

Операция new автоматически создает объект соответствующего размера и возвращает указатель правильного типа. Чтобы освободить область памяти, занимаемую этим объектом, используется операция delete.

Массив объектов можно размещать автоматически с помощью операции new, например, оператор

int *ptr = new int[100];



1 ... 162 163 164 [ 165 ] 166 167 168 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика