Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Стандартная библиотека, библиотеки MFC и ATL




Зачем рекомендуется использовать универсальные средства стандартной библиотеки вместо разработки своих узко-специализированных и, возможно, более эффективных?

Во-первых, использование программистом стандартных контейнеров и алгоритмов в своей программе делает ее более понятной для другого программиста, вынужденного разбираться в «чужом» коде.

Во-вторых, средства стандартной библиотеки хорошо протестированы и вероятность наличия в них ошибок достаточно мала.

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

Состав стандартной библиотеки

В соответствии со стандартом, любая полная реализация языка С++ должна включать стандартную библиотеку. Помимо такой библиотеки большинство реализаций предоставляют и другие библиотеки, в частности, библиотеки поддержки графического интерфейса пользователя (GUI –Graphical User Interface). Например, в состав среды Visual C++ входят библиотека базовых классов (MFC – Microsoft Foundation Classes) и библиотека шаблонных классов (ATL – Active Template Library).

Для многих заголовочных файлов стандартной библиотеки языка С <X.h> имеется соответствующий стандартный заголовочный файл С++ <cX>. Например, директива #include <cstdio> дает тот же результат, что и #include <stdio.h>. Этот результат становится очевидным, если посмотреть на содержимое заголовочного файла cstdio (он не имеет расширения):

// cstdio standard header

#if _MSC_VER > 1000

#pragma once

#endif

#ifndef _CSTDIO_

#define _CSTDIO_

#ifdef _STD_USING

 #undef _STD_USING

 #include <stdio.h>

 #define _STD_USING

#else

 #include <stdio.h>

#endif /* _STD_USING */

#endif /* _CSTDIO_ */

 

В табл. 1 перечислены заголовочные файлы стандартной библиотеки языка C++. Часть из этих файлов, а именно 13, входят в состав стандартной библиотеки шаблонов (STL – Standard Template Library). Файлы сгруппированы по категориям [4].

 

Таблица 1

Состав стандартной библиотеки С++

Файл Что объявлено

Контейнеры

<vector> одномерный массив элементов Т (STL)
<list> двусвязный список элементов Т (STL)
<deque> очередь элементов Т с двумя концами (STL)
<queue> очередь элементов Т (STL)
<stack> стек элементов Т (STL)
<map> ассоциативный массив элементов Т (STL)
<set> множество элементов Т (STL)
<bitset> битовый набор (массив бит)
   

Основные утилиты

<utility> пары (pair) и операции (STL)
<functional> объекты-функции (STL)
<memory> распределители памяти для контейнеров (STL)
<ctime> конвертирование времени и даты между различными форматами
   

Итераторы

<iterator> итераторы и их поддержка (STL)
   

Алгоритмы

<algorithm> основные алгоритмы (STL)
<cstdlib> функции bsearch() и qsort()
   

Диагностика

<stdexcept> объявления классов стандартных исключительных ситуаций
<cassert> макросы утверждений
<cerrno> обработка ошибок в стиле языка С
   

Строки

<string> строка элементов Т
<cctype> классификация символов
<cwtype> классификация символов из расширенного набора
<cstring> функции над строками в стиле С
<cwchar> функции над строками символов из расширенного набора в стиле С
<cstdlib> функции над строками в стиле С
   

Ввод/вывод

<iosfwd> предварительные объявления средств ввода/вывода
<iostream> стандартные объекты и операции с потоками ввода/вывода
<ios> базовые классы потоков ввода/вывода
<streambuf> буферизация потоков
<istream> шаблон потока ввода
<ostream> шаблон потока вывода
<iomanip> манипуляторы для управления состоянием потока
<sstream> потоки в строки/из строк
<cstdlib> функции для работы с символами
<fstream> потоки ввода/вывода в файлы
<cstdio> семейство функций ввода/вывода printf()
<cwchar> ввод/вывод символов из расширенного набора в стиле printf()
   

Локализация

<locale> локализует различия в человеческих языках и культурах
<clocale> локализует различия в человеческих языках и культурах в стиле С
   

Поддержка языка (программирования)

<limits> числовые ограничения
<climits> макросы пределов скалярных чисел в стиле С
<cfloat> макросы пределов чисел с плавающей точкой в стиле С
<new> динамическое распределение памяти
<typeinfo> поддержка идентификации типов во время выполнения
<exception> поддержка обработки исключительных ситуаций
<cstddef> языковая поддержка библиотеки С
<cstdarg> поддержка функций с переменным числом аргументов
<csetjmp> раскрутка стека в стиле С (для поддержки нелокальных передач управления)
<cstdlib> завершение программ
<ctime> системные часы
<csignal> для обработки исключительных ситуаций в стиле С
   

Числа

<complex> комплексные числа и операции над ними
<valarray> векторы чисел и операции над ними
<numeric> шаблоны функций, реализующих распространенные числовые операции (STL)
<cmath> общие математические функции
<cstdlib> случайные числа в стиле С

 

В качестве основного литературного источника по стандартной библиотеке я бы рекомендовал работу [4], а, в частности, по библиотеке стандартных шаблонов работу [5], одного из авторов которой – Степанова – считают чуть не единственным разработчиком этой библиотеки. Работа [6] также содержит описание, с примерами, библиотеки шаблонов и алгоритмов.

Библиотеки MFC и ATL

Эти две библиотеки являются разработкой Microsoft и входят в состав Microsoft Visual Studio.

Microsoft Foundation Class Library (MFC) предназначена для разработки каркаса приложения Windows.

Собираясь разрабатывать для Windows, надо сначала выбрать среду программирования. И если Вы уже отвергли варианты, не связанные с языком С (скажем, Microsoft Visual Basic или Borland Delphi), у Вас все же остается как несколько вариантов:

· программировать на С, применяя функции Win32 API;

· написать на С++ свою библиотеку классов, использующую Win32;

· задействовать каркас приложений на базе MFC;

· воспользоваться другим каркасом приложений, например, Windows Library (OWL) фирмы Borland (Inprise).

 

Если Вы начинаете с нуля, любой из этих вариантов потребует учиться очень и очень многому. Если Вы уже умеете программировать в Win32, Вам все равно придется осваивать библиотеку MFC. Почему? Потому что почти сразу после появления MFC она стала доминирующей библиотекой классов для Windows. Даже если Вы знакомы с MFC, не помешает еще раз вспомнить основные особенности программного продукта.

Библиотека MFC — API-интерфейс Windows на C++. Если Вы согласны с тем, что язык C++ сегодня является стандартом для разработки серьезных приложений, то должны признать, что для Windows естественен программный интерфейс на C++. Кто напишет интерфейс лучше, чем сама корпорация Microsoft, создавшая Windows? И этот интерфейс — библиотека MFC.

«Каркасные» приложения имеют стандартную структуру. Любой программист, приступающий к крупному проекту, старается выработать для себя какую-то структуру кода. Но проблема заключается в том, что эта структура у каждого программиста своя, и новому участнику команды трудно приспособиться к ней. Каркас приложений на базе MFC предлагает свою структуру, отработанную на многих проектах и опробованную в разных программных средах. Создав Windows-программу на базе библиотеки MFC, можно без всяких опасений скрыться от всех где-нибудь на Карибских островах — тем, кто остался дома, будет легко поддерживать и совершенствовать вашу программу.

Не подумайте только, что структура библиотеки MFC «сковывает» программы. При работе с MFC можно в любой момент вызвать любую Win32-функцию, т. е. в полной мере использовать возможности и преимущества Windows.

Microsoft Active Template Library (ATL) представляет собой средство построения элементов управления ActiveX, отдельное от MFC. Вообще говоря, писать элементы ActiveX можно как на MFC, так и на ATL, но ATL-элементы меньше по объему кода и быстрее загружаются по Интернету.

Распространенной  ошибкой является мнение о том, что MFC и ATL исключают друг друга. Это совершенно не так! На самом деле, очень легко создать СОМ-объекты, использующие MFC, на основе ATL. Единственная проблема состоит в том, что поскольку многие разработчики выбирают ATL за то, что она позволяет получать код малого размера, постольку использование MFC, которая богата возможностями и является «тяжелой», выглядит противоречащим причине использования ATL. Хотя это может быть важно для некоторых разработчиков, но вовсе не делает ATL и MFC взаимоисключающими.

 



Коллекции

Обзор коллекций MFC

(См. раздел MSDN «Collections topics»)

 

Библиотека MFC предоставляет коллекцию классов для манипулирования (обработки) групп объектов различных типов. Эти классы подразделяются на две основные группы по признаку происхождения:

· коллекции классов, созданные на основе шаблонов;

· коллекции классов, построенные не на шаблонах.

 

Любой класс коллекция характеризуется своей «формой» (shape) и типом элементов. Под формой класса понимается способ организации и хранения элементов коллекции. MFC предоставляет три основные формы коллекций:

· списки (lists);

· массивы (arrays);

· ассоциативные массивы (maps), называемые иногда словарями (dictionaries).

 

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

 

Списки. Классы списков предоставляют упорядоченную, неиндексированную совокупность элементов, реализованную в форме двусвязного списка. Список имеет «голову» (head) и «хвост» (tail) и добавление или удаление элементов с головы или хвоста, равно как и вставка или удаление элементов из середины могут быть выполнены очень быстро.

Массивы. Эти классы обеспечивают индексированную, упорядоченную совокупность элементов, число элементов которой можно динамически изменять.

Ассоциативные массивы. Эти массивы представляют собой совокупность пар элементов: ключ и значение. Другими словами, элементы такого массива индексируются уникальными ключами.

 

Основанные на шаблонах коллекции.

Использование какого-либо класса MFC, построенного на основе шаблона, представляет собой простейший и типо-безопасный (type-safe) способ манипулирования объектами любого типа. Основанные на шаблонах коллекции приведены в табл. 1.

Таблица 1.

Шаблонные классы коллекций

Тип элементов коллекции Массивы Списки Ассоциативные массивы
Произвольный CArray CList CMap
Указатель на объект любого типа CTypedPtrArray CTypedPtrList CTypedPtrMap

 

 


Нешаблонные классы коллекций.

Эти коллекции (табл. 2) считаются устаревшими и их не рекомендуется использовать в новых разработках.

 

 

Таблица 2.

Нешаблонные классы коллекций

Массивы Списки Ассоциативные массивы
CObArray CObList CMapPtrToWord
CByteArray CPtrList CMapPtrToPtr
CDWordArray CStringList CMapStringToOb
CPtrArray   CMapStringToPtr
CStringArray   CMapStringToString
CWordArray   CMapWordToOb
CUIntArray   CMapWordToPtr

 

Выбор коллекции.

При выборе формы коллекции надо учитывать следующие факторы:

· свойства коллекции: упорядоченность, индексирование, эффективность;

· основан ли класс на шаблоне;

· имеет ли коллекция встроенную функцию сериализации Serialize();

· имеет ли коллекция встроенную функцию Dump() (вывода для отладки);

· является ли коллекция типо-безопасной.

 

В табл.3 приведены свойства классов коллекций. Во втором и третьем столбцах таблицы приведен признак упорядоченности элементов коллекций и возможность индексирования. Термин «упорядоченность» не означает, что элементы коллекции отсортированы; он означает только то, что порядок размещения элементов коллекции соответствует порядку их добавления или вставки. Термин «индексированность» означает возможность получения доступа к элементам коллекции по целочисленному индексу (с нуля), как в обычном массиве.   

Столбцы 4 и 5 характеризуют эффективность использования коллекции. В тех задачах, для которых характерны многочисленные операции вставки элементов в коллекции, скорость вставки является определяющим фактором, в то время как для других задач скрорость поиска более важна.

Наконец, в шестом столбце указано, могут ли встречаться в коллекции элементы с одинаковыми значениями.

Таблица 3.

Свойства коллекций

Вид коллекции Упорядоченность Индексируемость Вставка элемента Поиск элемента Наличие одинаковых элементов
Список Да Нет Быстрая Медленная Да
Массив Да Целым числом Медленная Медленная Да
Ассоциатив-ный массив Нет По ключу Быстрая Быстрая Нет (ключ) Да (знач.)

В табл.4 собраны характеристики классов коллекций MFC, которые должны помочь при выборе конкретного класса для конкретной задачи. На Ваш выбор могут влиять такие характеристики классов, как наличие шаблона, наличие встроенных механизмов сериализации и дампинга, типо-безопасность (type-safe). Термин типо-безопасность означает наличие гарантии того, что помещаемый в коллекцию элемент или извлекаемый из нее действительно имеет ожидаемый тип.

Таблица 3.

Свойства коллекций

Класс Шаблонный Сериализация Дампинг Типо-безопасность
CArray Да Да 1 Да 1 Нет
CByteArray Нет Да Да Да 3
CDWordArray Нет Да Да Да 3
CList Да Да 1 Да 1 Нет
CMap Да Да 1 Да 1 Нет
CMapPtrToPtr Нет Нет Да Нет
CMapPtrToWord Нет Нет Да Нет
CMapStringToOb Нет Да Да Нет
CMapStringToPtr Нет Нет Да Нет
CMapStringToString Нет Да Да Да 3
CMapWordToOb Нет Да Да Нет
CMapWordToPtr Нет Нет Да Нет
CObArray Нет Да Да Нет
CObList Нет Да Да Нет
CPtrArray Нет Нет Да Нет
CPtrList Нет Нет Да Нет
CStringArray Нет Да Да Да 3
CStringList Нет Да Да Да 3
CTypedPtrArray Да Да/Нет 2 Да Да
CTypedPtrList Да Да/Нет 2 Да Да
CTypedPtrMap Да Да/Нет 2 Да Да
CUIntArray Нет Нет Да Да 3
CWordArray Нет Да Да Да 3

 

 

Примечания к табл.

1. Для сериализации достаточно просто вызвать функцию Serialize() для элемента коллекции, а для дампига – функцию Dump(). Вы не можете просто использовать оператор ar << collObj; для сериализации или оператор dс << collObj; для дампинга.

2. Наличие или отсутствие сериализации зависит от типа элементов коллекции. Например, если типизированный массив указателей основан на CObArray, то он сериализуем; если он основан на CPtrArray – то нет. Как правило, классы с “Ptr” не сериализуемы.

3. Если в этом столбце указано «Да», то нешаблонный класс коллекции является типо-безопасным, если используется по прямому назначению. Например, если Вы сохраняете байты в CByteArray, то массив является типо-безопасным. Однако, если тот же массив Вы используете для хранения символов, его типо-безопасность сомнительна.

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 704.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...