Классы общего назначения в языке Си

Автор работы: Пользователь скрыл имя, 13 Апреля 2013 в 10:28, реферат

Описание

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

Содержание

Введение 3
1.Класс CString 4
2.Класс CTime и CTimeSpan 7
3.Класс COleDateTime 10
4.Классы файлов MFC 11
5.Класс CArchive 14
6.Коллекции объектов MFC 18
7.Обработка исключительных ситуаций 21
Заключение 26
Использованная литература 27

Работа состоит из  1 файл

реферат.doc

— 116.00 Кб (Скачать документ)

 

Функции-члены  в 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, из которого будут считываются или записываться данные. Перед вызовом конструктора файл, связанные с объектом pFile должен быть уже открыт.

 

Параметр 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 заключается  в том, что объекты вашего класса могут посредством него записать свое состояние в файл, а затем  при необходимости восстановить его. Для этого в классе 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 должна восстановить из файла все  элементы данных, которые были в  него записаны. Для этого можно воспользоваться оператором >> или методами ReadString и Read, определенными в классе CArchive.

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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 входят классы, предназначенные для организации  двунаправленных списков указателей, строк, состоящих из объектов CString, указателей на объекты класса CObject. В MFC версии 4.0 добавлен шаблон класса списка CList XE "CList" . С помощью этого шаблона можно создавать списки, состоящие из любых объектов.

 

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

 

Ниже представлен прототип шаблона 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) — механизм языков программирования, предназначенный для обработки ошибок времени выполнения и других возможных проблем ( "исключений "), которые могут возникнуть при выполнении программы. Также применяется некорректный, но устоявшийся термин «обработка исключений».

 

В целом, при возникновении  исключительной ситуации, управление передаётся некоторому заранее определённому "обработчику ". В некоторых  языках, обработчик может возобновить  выполнение программы с места  возникновения исключения. Таким  образом, обработка ошибок передаётся на более высокий уровень и обеспечивается возможность так называемого "нелокального выхода ", т. е. передачи управления на некоторую «удалённую», возможно заранее неизвестную, точку программы через произвольное число вызовов функций.

 

Достоинства и недостатки

 

Исключения предоставляют  основные преимущества при разработке отдельных компонентов, когда разработчик  компонента не знает, как нужно обработать исключение и оставляет написание  обработчика исключения пользователю его компонента.

 

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

 

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

 

Также в сложных программах возникают большие «нагромождения»  операторов try ... finally и try ... catch (try ... except).

 

Поддержка в  различных языках

 

Большинство современных  языков программирования, такие как Ada, C++, D, Delphi, Objective-C, Java, JavaScript, Eiffel, OCaml, Ruby, Python, Common Lisp, SML, PHP, Глагол и все языки  платформы .NET и др. имеют встроенную поддержку обработки исключений. В этих языках, при возникновении исключения (точнее, исключения, поддерживаемого языком), происходит раскрутка стека вызовов до первого обработчика исключений подходящего типа, и управление передаётся обработчику.

 

За исключением незначительных различий в синтаксисе, существует лишь пара вариантов обработки исключений. В наиболее распространённом из них исключительная ситуация генерируется специальным оператором (throw или raise) с объектом-исключением. При этом, конструирование такого объекта само по себе выброса исключения не вызывает. Область действия обработчиков начинается специальным ключевым словом try или просто языковым маркером начала блока (например, begin) и заканчивается перед описанием обработчиков (catch, except, resque). Обработчиков может быть несколько, один за одним, и каждый может указывать тип исключения, который он обрабатывает.

Информация о работе Классы общего назначения в языке Си