Собственные методы класса
Работая с классом, производным от класса MFC, разработчик не только вводит в него реакции на сообщения и переопределяет виртуальные функции. Он также вносит в класс свою собственную функциональность, вводя в него вспомогательные методы (helper functions). Сейчас мы создадим несколько таких функций. Новый метод ReadErrors будет заниматься поиском, чтением и анализом файла WinError.h.
- Переведите фокус мыши на узел CLookDlg в дереве классов Class View, вызовите контекстное меню и дайте команду Add › Add Function.
- В окне мастера Add Member Function Wizard заполните следующие поля:
- Return type: bool,
- Function name: ReadErrors.
- В поле Access: задайте тип доступа – public.
- В поле Comment: введите комментарий Search and read errors (моя версия Studio .NET не позволяет пользоваться русским языком в этом диалоге).
Просмотрите изменения в классе CLookDlg, которые произвел мастер. Комментарий он помещает в файл заголовков (интерфейс класса). Введите следующий код в тело новой функции:
bool CLookDlg::ReadErrors () { //==== Поиск и чтение информации об ошибках //==== Пытаемся найти путь в реестре string sPath = GetPathFromRegistry (); //==== В случае неудачи пытаемся узнать у пользователя if (sPath .empty ()) sPath = GetPathFromUser О; if (sPath.emptyO) return false; // При отказе уходим //==== Пытаемся открыть файл if stream is (sPath .c_str ()); if (!is) { MessageBox ("He могу найти WinError.h", "Выход"); return false; //====== Последовательно ищем все ошибки while (GetNextErrorCode (is)) { //==== Создаем новый объект типа ErrorType и //==== помещаем его в контейнер m_Vector.push_back (ErrorType (gCode, gsID, gsMsg)); } is .closet); // Закрываем файл //====== Запоминаем размер контейнера m_nltems = m_Vector .size (); return bool (m_nltems!= 0); }
Здесь мы вызываем функции (Getxxx), которых еще нет. Это является типичной практикой разработки многомодульных приложений. Мы определяем прототипы функций так, как того требует логика алгоритма, а тела будут созданы позже. Вы должны обратить внимание на объявление объекта is класса ifstream, который определен в STL. Поставьте курсор на имя класса ifstream и воспользуйтесь окном Dynamic Help, для того чтобы получить справку об этом классе. Из нее вы мало что узнаете, так как, к сожалению, все справки по библиотеке STL в разделе Reference слишком краткие, но если использовать поиск, то в MSDN можно получить достаточно подробную информацию о потоковом вводе-выводе.
В рассматриваемом коде мы вызываем конструктор класса ifstream, который создает поток ввода, связывает его с буфером и пытается открыть файл, путь к которому задан в параметре (sPath.c_str()). Вы помните, что вызов c_str() дает возможность пользоваться строкой в стиле языка с (то есть const char*), которая прячется в строке типа string. Операция "!", переопределенная в классе ifstream, сообщает нам о неудаче при открытии файла. Переменные gCode, gsio, gsMsg – это глобальные переменные, которые мы собираемся завести для временного хранения параметров ошибки (кода, индекса и сообщения).
Примечание
Работая с объектами классов, вы можете создавать глобальные данные и функции. Это оправдано, когда надо расширить область видимости каких-то данных или когда функция имеет универсальный характер, например ищет в файле строку текста. Если вы знаете или вам кажется, что создаваемую функцию можно использовать и вне контекста класса, то ее целесообразно объявить глобальной.