Классы общего назначения в языке Си
Министерство образования Российской Федерации
Южно-Уральский
Приборостроительный факультет
Кафедра автоматики и управления
Реферат на тему:
«Классы общего назначения в языке Си»
Выполнила:
Кулиненко Е. Е.
ПС-145
Проверил:
Касюк С.Т.
Челябинск 2008
Содержание
Введение 3
1.Класс CString 4
2.Класс CTime и CTimeSpan 7
3.Класс COleDateTime 10
4.Классы файлов MFC 11
5.Класс CArchive 14
6.Коллекции объектов MFC 18
7.Обработка исключительных ситуаций 21
Заключение 26
Использованная литература 27
Введение
Си - универсальный язык программирования. Си обеспечивает разнообразие типов данных. Базовыми типами являются символы, а также целые и числа с плавающей точкой различных размеров. Кроме того, имеется возможность получать целую иерархию производных типов данных из указателей, массивов, структур и объединений. Выражения формируются из операторов и операндов. Любое выражение, включая присваивание и вызов функции, может быть инструкцией. Указатели обеспечивают машинно-независимую адресную арифметику. Си, как и любой другой язык программирования, не свободен от недостатков. Уровень старшинства некоторых операторов не является общепринятым, некоторые синтаксические конструкции могли бы быть лучше. Тем не менее, как оказалось, Си - чрезвычайно эффективный и выразительный язык, пригодный для широкого класса задач.
В языке Си существует несколько классов общего назначения, о которых и пойдет речь. В данной работе рассматриваются классы CString, CTime, CTimeSpan, ColeDateTime, классы файлов MFC, класс CArchive, коллекции объектов MFC и обработка исключительных ситуаций.
1. Класс CString
Класс CString - текстовые строки
Практически ни одно приложение не обходится без использования текстовых строк. Язык Си и Си++ не имеет специального строкового типа. Обычно для хранения строк используют массивы символов. MFC предоставляет программисту более удобное средство для организации и работы со строками. Для этого предназначен специальный класс CString.
Строки CString XE "CString" состоят из символов, типа TCHAR XE "TCHAR" . Тип TCHAR определяется по разному в зависимости от того, определен или нет символ _UNICODE XE "_UNICODE" . Если символ _UNICODE не определен, TCHAR соответствует обычному типу char. В противном случае он представляет символы, определяемые двумя байтами.
При использовании класса CString отпадает необходимость постоянно следить за тем, чтобы длина строки не превысила объем выделенной для нее памяти. Строки CString XE "CString" автоматически расширяются и сокращаются в зависимости от фактической длины строки.
В класс CString входят методы, выполняющие все основные операции над строками - копирование, сравнение, присваивание и т. д. Над объектами класса CString определены такие операции как +, -, облегчающие работу со строками. Строки, представленные объектами CString, можно сравнивать, используя обычные операторы сравнения <, >, <=, >=, ==. Объекты класса CString можно записывать на диск - для них работает механизм сохранения и восстановления объектов класса. Фактически вы можете работать со стоками как с другими простыми типами данных.
Строки CString можно использовать совместно с строками языка Си (массивами символов, заканчивающихся знаком двоичного нуля). Вы можете обращаться к объектам класса CString как к обычным массивам символов, то есть использовать их как строки символов языка Си. Вы можете указывать строки в качестве параметра функций и методов, которые принимают параметры типа const char* или LPCTSTR.
Класс CString содержит большое количество различных методов, предназначенных для работы со строками. Среди них есть методы для доступа к отдельным элементам строки, сравнения строк между собой, поиска подстрок, сохранения строк в файле и их последующего восстановления. Мы оставляем класс CString для вашего самостоятельного изучения и ограничимся описанием только самых основным методов.
Конструктор класса
Класс CString имеет несколько различных конструкторов, позволяющих создавать строки на основе различных данных.
Конструктор класса CString, используемый по умолчанию, не имеет параметров. Он создает пустую строку. В последствии вы можете записать в нее любой текст.
CString();
Для класса CString определен конструктор копирования. Он позволяет создать строку на основе другой, ранее определенной строки. Этот и все остальные конструкторы могут вызвать исключение CMemoryException XE "CMemoryException" , если для создания строки недостаточно оперативной памяти.
CString(const CString& stringSrc);
throw(CMemoryException);
Конструктор, представленный ниже, позволяет создать строку из nRepeat символов ch. Параметр nRepeat можно не указывать. В этом случае строка будет содержать единственный символ ch.
CString(TCHAR ch, int nRepeat = 1);
throw(CMemoryException);
Вы можете создать новую строку и скопировать в нее nLength символов из массива lpch. Строка, расположенная в массиве lpch, может не иметь завершающего двоичного нуля. Для этого используйте следующий указатель:
CString(LPCTSTR lpch, int nLength);
throw(CMemoryException);
Новую строку можно создать и скопировать в нее данные из массива символов, закрытого двоичным нулем. В этом случае количество символов, которые будут записаны в новую строку не указывается. Копируются все символы до двоичного нуля.
Для создания строки вы можете воспользоваться одним из трех конструкторов, представленных ниже. Как видите, конструкторы отличаются только типом параметра:
CString(const unsigned char* psz);
throw(CMemoryException);
CString(LPCWSTR lpsz);
throw(CMemoryException);
CString(LPCSTR lpsz);
throw(CMemoryException);
2. Класс CTime и CTimeSpan
CTime не имеет базового класса.
Объект CTime представляет
абсолютное время и дату. Класс CTime
объединяет тип данных ANSI time_t и ассоциированные
run-time функции (функции периода выполнения),
включая способность
Значение CTime базируется на UTC (coordinated universal time -универсальные координаты времени), которые эквивалентны GMT (Greenwich mean time - значение времени по Гринвичу). Местная временная зона контролируется переменной среды окружения - TZ.
При создании CТime установите
параметр nDST равным 0 для сообщения
что действует стандартное
Для получения более подробной информации о типе данных time_t и run-time функциях, которые использует CTime смотри Run-Time Library Reference.
Дружественный класс CTimeSpan, представляет промежуток времени - разницу между двумя объектами CTime.
Классы CTime и CTimeSpan не предназначены для наследования, так как они не имеют виртуальных функций. Размер объектов CTime и CTimeSpan обычно - 4 байта. Большинство функций-членов - встроенные (inline).
Для получения более подробной информации смотри статью Date and Time в Visual C++ Programmer's Guide и Time Management в Run-Time Library Reference.
Члены класса CTime
КонструкторыCTime Различные конструкторы объекта CТime.
GetCurrentTime Создание объекта CTime содержащего текущее время (статическая член-функция).
Методы доступа GetTime Возвращает time_t соответствующее объекту CТime.
GetYear Возвращает год, который содержит данный объект CTime.
GetMonth Возвращает месяц, который содержит данный объект CTime. (от 1 до 12).
GetDay Возвращает день, который содержит данный объект CTime. (от 1 до 31).
GetHour Возвращает час, который содержит данный объект CTime. (от 0 до 23).
GetMinute Возвращает минуты, которые содержит данный объект CTime. (от 0 до 59).
GetSecond Возвращает секунды, которые содержит данный объект CTime. (от 0 до 61).
GetDayOfWeek Возвращает день недели (1 - воскресенье, 2 - понедельник, и т.д.).
КонверторыGetGmtTm Разбивает объект CТime на компоненты - основываясь на UTC.
GetLocalTm Разбивает объект CTime на компоненты - основываясь на локальной временной зоне (local time zone).
GetAsSystemTime Переводит информацию о времени сохраненную в объекте CТime в Win32-совместимую SYSTEMTIME структуру
Format Переводит объект CТime в форматированную строку - основываясь на локальной временной зоне (local time zone).
FormatGmt Переводит объект CТime в форматированную строку - основываясь на UTC.
Операторыoperator = Присвоить новое значение.
operator + - Добавить или вычисть объекты CТimeSpan или CТime.
operator +=, -= Добавить или вычисть объект CТimeSpan к или из данного объекта CТime.
operator ==, < , etc. Сравнить два абсолютных значения времени.
Сохранениеoperator << Вывести объект CTime в CArchive или CDumpContext.
operator >> Получить объект CTime из CArchive.
3. Класс COleDateTime
Библиотека MFC предоставляет класс COleDateTime, облегчаю-
щий работу с датами. Вы можете сформировать дату следующим образом:
COleDateTime date(1998, 10, 1, 18, 0, 0); // 1 октября 1998, 6 часов вечера
В классе COleVariant определен оператор присваивания для COleDateTime, а у COleDateTime
есть функции-члены для
показания времени:
TRACEftime = %d:%d:%d\n",
date.GetHourO, date.GetMinuteC), date.GetSecond());
Если у Вас есть переменная VARIANT, содержащая значение типа DATE, то для преобразо-
вания даты в строку можно использовать COleVariant::ChangeType-.
COleVariant vaTimeDate = date;
COleVariant vaTemp;
vaTemp.ChangeType(VT_BSTR, &vaTimeDate);
CString str = vaTemp.bstrVal;
TRACEC'date = %s\rT, str);
И последнее замечание о параметрах Invoke-, у функции, вызываемой через IDispatch, мо-
гут быть необязательные параметры (optional parameters). Если компонент объявляет тип
последних параметров (крайних справа) как VARIANT, то клиент не обязан передавать их. При
таком вызове (без определения значения необязательного параметра) поле vt объекта VARIANT
на стороне компонента будет содержать VT_ERROR.
4. Классы файлов MFC
Иерархия классов MFC
Библиотека MFC содержит большую иерархию классов, написанных на С++. Структура иерархии приведена на рис. 1. В ее вершине находится класс СObject, который содержит различные функции, используемые во время выполнения программы и предназначенные, в частности, для предоставления информации о текущем типе во время выполнения, для диагностики, и для сериализации.
Информация о типе времени выполнения
Если указатель или ссылка ссылается на объект, производный от класса CObject, то в этом случае предусмотрен механизм определения реального типа объекта с помощью макроса RUNTIME_CLASS(). Хотя в С++ имеется механизм RTTI, механизм, реализованный в MFC, намного более эффективен по производительности.
Диагностика
Каждый класс, производный от CObject, может по запросу проверить свое внутреннее состояние и выдать диагностическую информацию. Это интенсивно используется в MFC при отладке.
Сериализация
Сериализация - это механизм, позволяющий
преобразовать текущее
Основные классы
Некоторые классы порождаются непосредственно от CObject. Наиболее широко используемыми среди них являются CCmdTarget, CFile, CDC, CGDIObject и CMenu. Класс ССmdTarget предназначен для обработки сообщений. Класс СFile предназначен для работы с файлами. Класс CDC обеспечивает поддержку контекстов устройств. Об контекстах устройств мы будем говорить несколько позднее. В этот класс включены практически все функции графики GDI. CGDIObject является базовым классом для различных DGI-объектов, таких как перья, кисти, шрифты и другие. Класс СMenu предназначен для манипуляций с меню. От класса CCmdTarget порождается очень важный класс CWnd. Он является базовым для создания всех типов окон, включая масштабируемые ("обычные") и диалоговые, а также различные элементы управления. Наиболее широко используемым производным классом является CFrameWnd. Как Вы увидите в дальнейшем, в большинстве программ главное окно создается с помощью именно этого класса.
От класса CCmdTarget, через класс CWinThread, порождается, наверное, единственный из наиболее важных классов, обращение к которому в MFC-программах происходит напрямую: CWinApp. Это один из фундаментальных классов, поскольку предназначен для создания самого приложения. В каждой программе имеется один и только один объект этого класса. Как только он будет создан, приложение начнет выполняться.
Функции-члены в MFC
Большинство функций, вызываемых в MFC-программе, являются членами одного из классов, определенных в библиотеке. Большинство функций API доступны через функции-члены MFC. Тем не менее, всегда можно обращаться к функциям API напрямую. Иногда это бывает необходимым, но все же в большинстве случаев удобнее использовать функции-члены MFC.
Глобальные функции в MFC
В библиотеке есть ряд глобальных функций. Все они начинаются с префикса Afx. (Когда MFC только разрабатывалась, то проект назывался AFX, Application Framework. После ряда существенных изменений AFX была переработана в MFC, но прежнее название сохранилось во многих идентификаторах библиотеки и в названиях файлов.) Например, очень часто используется функция AfxMessageBox(), отображающая заранее определенное окно сообщения. Но есть и член-функция MessageBox(). Таким образом, часто глобальные функции перекрываются функциями-членами.
Файл AFXWIN.H
Все MFC-программы включают заголовочный файл AFXWIN.H. В нем, а также в различных вспомогательных файлах, содержатся описания классов, структур, переменных и других объектов MFC. Он автоматически подключает большинство заголовочных файлов, относящихся к MFC, в том числе и WINDOWS.H, в котором определены все функции Windows API и другие объекты, которые используются при традиционном программировании на С и "чистом" API.
Каркас MFC-программы
Теперь мы создадим с помощью MFC небольшое приложение. Оно только отображает стандартное окно Windows, и больше ничего не делает. При закрытии окна приложение завершается. Это приложение послужит основой для всех других приложений, которые мы будем рассматривать.
В простейшем случае программа, написанная с помощью MFC, содержит два класса, порождаемые от классов иерархии библиотеки: класс, предназначенный для создания приложения, и класс, предназначенный для создания окна. Другими словами, для создания минимальной программы необходимо породить один класс от CWinApp, а другой - от CFrameWnd. Эти два класса обязательны для любой программы.
5. Класс CArchive
Перед тем как создать объект класса CArchive, необходимо создать объект класса CFile. Связывая с объектом CFile XE "CFile" файл на диске, имейте в виду, что если вы желаете записать объект файл, то файл надо открыть на запись, а если надо считать файл с диска и загрузить из него данные в объект, открыть файл надо для чтения.
Конструктор класса CArchive имеет следующий вид:
CArchive(CFile* pFile, UINT nMode, int nBufSize = 512,
void* lpBuf = NULL);
throw(CMemoryException, CArchiveException, CFileException);
Параметр pFile должен содержать
указатель на объект класса CFile, из которого
будут считываются или
Параметр nMode определяет, будут данные записываться в файл или считываться из него. Параметр nMode может принимать одно из трех значений CArchive::load, CArchive::store или CArchive::bNoFlushOnDelete, описанных в следующей таблице.
Константа
Описание
CArchive::load
Данные считываются из файла на диске. Впоследствии они будут записаны в восстанавливаемый объект. В этом случае файл, определенный параметром pFile, должен быть открыт для чтения.
CArchive::store
Данные будут записываются в файл на диске. Файл, определенный параметром pFile должен быть открыт для записи.
Для операций чтения и записи в файл класс CArchive выполняет буферизацию. Размер этого буфера определяется необязательным параметром nBuf Size в байтах. Если вы не укажите размер буфера, используется буфер размером 512 байт.
Конструктор класса CArchive сам получает у операционной системы блок оперативной памяти для буфера. Однако с помощью необязательного параметра lpBuf вы можете предоставить собственный буфер. В этом случае параметр nBufSize должен указывать размер этого буфера.
Созданный вами объект класса CArchive можно будет использовать только для записи или только для чтения. Если вам надо сначала считать данные, а потом записать, следует создать для этого два отдельных объекта класса CArchive.
Не используйте методы
класса CFile для доступа к файлу
во время его использования
Основное предназначение объекта класса CArchive заключается в том, что объекты вашего класса могут посредством него записать свое состояние в файл, а затем при необходимости восстановить его. Для этого в классе CArchive определены операторы записи в файл << и чтения из файла >>. Вы также можете использовать методы WriteString, Write, ReadString и Read. Опишем эти операторы и методы более подробно.
Запись в архивный файл
Когда приложение желает сохранить состояние объекта данного класса в файле, оно вызывает для него метод Serialize. В качестве параметра этому методу передается указатель на объект класса CArchive, связанные с файлом, открытым на запись.
В этом случае реализация метода Serialize должна сохранить в файле все элементы данных, которые потом потребуется восстановить. Для этого необходимо воспользоваться оператором << или методами WriteString и Write, определенными в классе CArchive.
Оператор << можно использовать для записи в архивный файл переменных простых типов, например long, int, char и объектов других классов, которые наследованы от класса CObject.
В одной строке программы можно использовать оператор << несколько раз. Такая запись сокращает исходный код программы и делает его более легким для понимания, так как все операторы << будут сгруппированы вместе.
Для записи в архивный файл массивов удобнее использовать метод Write класса CArchive XE "CArchive" :
void Write(const void* lpBuf, UINT nMax);
throw(CFileException);
Он позволяет записать в файл определенное количество байт из указанного буфера памяти.
Параметр lpBuf является указателем на сохраняемую область данных, а параметр nMax определяет количество байт из этой области, которое надо записать в файл.
Если требуется сохранить строку символов, закрытую нулем, то гораздо удобнее вместо метода Write использовать метод WriteString. Метод WriteString записывает в архивный файл строку lpsz:
void WriteString(LPCTSTR lpsz);
throw(CFileException);
Чтение из архивного файла
В предыдущем разделе мы рассказали как сохранить объект вашего класса в архивном файле. Теперь опишем, как восстановить записанное ранее состояние объекта класса из архивного файла. Когда приложение желает восстановить состояние объекта данного класса, оно вызывает для него метод Serialize. В качестве параметра этому методу передается указатель на объект класса CArchive, связанного с файлом, открытым для чтения.
Реализация метода Serialize
должна восстановить из файла все
элементы данных, которые были в
него записаны. Для этого можно воспользоватьс
Вы должны считывать данные из архивного файла именно в том порядке, в котором они были в него записаны.
6. Коллекции объектов MFC
Коллекции
Перед программистом часто возникает задача упорядоченного хранения объектов и переменных. Для этого он вынужден самостоятельно реализовывать такие структуры как списки, сложные массивы. Библиотека классов MFC позволяет значительно облегчить решение этих задач.
В состав MFC входят специальные классы для хранение и обработки групп переменных или объектов. Они позволяют быстро создавать массивы и списки объектов. Облегчается создание небольших словарей, позволяющих по ключевому полю получить ранее записанное в словарь значение. Класс словарей реализует эффективный механизм хеширования. С использованием таких классов отпадает необходимость в самостоятельной разработке и длительной отладке. Программист сможет уделить больше времени прикладной части своего приложения.
Массивы - шаблон CArray
Библиотека MFC включает классы для организации массивов байт, слов, двойных слов, указателей, объектов класса CString и указателей на объекты класса CObject. В MFC версии 4.0 добавлен шаблон класса массива, позволяющий создавать на его основе собственные массивы переменных любых типов и массивы объектов любых классов. Для доступа к элементам массива можно использовать оператор [].
Ниже представлен прототип шаблона CArray XE "CArray" .
template <class TYPE, class ARG_TYPE>
class CArray : public CObject
Параметр шаблона XE "шаблона" XE "шаблоны" TYPE определяет тип элементов массива. В качестве TYPE можно указывать не только простые типы, например int, char, но также типы, являющиеся классами. Второй параметр шаблона ARG_TYPE определяет тип параметра массива, который используется для доступа к его элементам.
Мы будем использовать шаблон CArray для организации массива в приложении Single (см. раздел “Простейший графический редактор” главы “Однооконный интерфейс”).
Списки - шаблон CList
В состав MFC входят классы,
предназначенные для
Списковый класс имеет методы для вставки и удаления элементов в начало, конец и середину списка. Вы можете получить предыдущий и следующий элемент из списка.
Ниже представлен прототип шаблона CList.
template <class TYPE, class ARG_TYPE>
class CList : public CObject
Словари - шаблон CMap
Словарь, это таблица переменной длины, состоящая из двух колонок. Первая колонка содержит ключевые поля, а вторая - соответствующие им значения. Пользуясь объектами этого класса, вы можете по ключевому полю получить связанное с ним значение. Для поиска по ключу используется алгоритм хеширования, реализация которого вручную заняла бы слишком много времени.
В MFC включены классы для создания словарей отображающих значения слов, указателей, указателей на объекты типа CObject и объектов CString. Библиотека MFC версии 4.0 содержит шаблоны для организации словарей. Шаблоны позволяют создать класс словарей, основанных на объектах любых типов.
Ниже представлен прототип шаблона CMap XE "CMap" .
template <class KEY, class ARG_KEY, class VALUE,
class ARG_VALUE> class CMap : public CObject
Параметр шаблона KEY определяет тип ключевого поля словаря. Параметр ARG_KEY является типом данных, используемых в качестве аргумента KEY. Параметр VALUE соответствует типу элементов, хранящихся в словаре, а параметр ARG_VALUE используется в качестве аргумента VALUE.
7. Обработка исключительных ситуаций
Обработка исключительных ситуаций ( _en. exception handling) — механизм языков программирования, предназначенный для обработки ошибок времени выполнения и других возможных проблем ( "исключений "), которые могут возникнуть при выполнении программы. Также применяется некорректный, но устоявшийся термин «обработка исключений».
В целом, при возникновении исключительной ситуации, управление передаётся некоторому заранее определённому "обработчику ". В некоторых языках, обработчик может возобновить выполнение программы с места возникновения исключения. Таким образом, обработка ошибок передаётся на более высокий уровень и обеспечивается возможность так называемого "нелокального выхода ", т. е. передачи управления на некоторую «удалённую», возможно заранее неизвестную, точку программы через произвольное число вызовов функций.
Достоинства и недостатки
Исключения предоставляют основные преимущества при разработке отдельных компонентов, когда разработчик компонента не знает, как нужно обработать исключение и оставляет написание обработчика исключения пользователю его компонента.
Использование исключений в целях контроля ошибок повышает читаемость кода, так как позволяет отделить обработку ошибок от самого алгоритма, и облегчает программирование и использование компонентов других разработчиков.
Основной недостаток исключений — в их невысокой скорости. В местах программы, критичных по скорости, не стоит возбуждать и обрабатывать исключения.
Также в сложных программах
возникают большие «
Поддержка в различных языках
Большинство современных
языков программирования, такие как
Ada, C++, D, Delphi, Objective-C, Java, JavaScript, Eiffel, OCaml, Ruby,
Python, Common Lisp, SML, PHP, Глагол и все языки
платформы .NET и др. имеют встроенную
поддержку обработки исключений
За исключением незначительных различий в синтаксисе, существует лишь пара вариантов обработки исключений. В наиболее распространённом из них исключительная ситуация генерируется специальным оператором (throw или raise) с объектом-исключением. При этом, конструирование такого объекта само по себе выброса исключения не вызывает. Область действия обработчиков начинается специальным ключевым словом try или просто языковым маркером начала блока (например, begin) и заканчивается перед описанием обработчиков (catch, except, resque). Обработчиков может быть несколько, один за одним, и каждый может указывать тип исключения, который он обрабатывает.

- Классы опасности отходов
- Классы органических соединений
- Классы российского общества
- Классы точности средств измерений
- Классы условия труда
- Кластер баз данных
- Кластери як нові форми об’єднання підприємств
- Классы в соременном обществе
- Классы и подклассы информационной защиты
- Классы и слои России в условиях современной модернизации
- Классы и страты
- Классы капитальности
- Классы классовая система, многообразие подходов
- Классы компенсирующего и коррекционно-развивающего обучения