0006 - MFC - Внутренний мир - Значит, пора завершать эту тему. Нам осталось только

Румянцев П.В. MFC - Внутренний мир. 2003

 Румянцев П.В. 
.  MFC - Внутренний мир 
. 2003
. 5-93517-113-9
. Москва Горячая линия - Телеком
. 
. Книга содержит информацию о библиотеке классов MFC (Microsoft Foundation Classes) и методах создания Windows-приложений на основе классов этой библиотеки
Название: 
MFC - Внутренний мир
Автор: 
Румянцев П.В.
Год: 
2003
Издательство: 
Москва Горячая линия - Телеком
Описание: 

Книга содержит информацию о библиотеке классов MFC (Microsoft Foundation Classes) и методах создания Windows-приложений на основе классов этой библиотеки. Сведения, изложенные в этой книге, собраны автором исключительно на основе изучения и анализа исходных кодов MFC. Для программистов.

Значит, пора завершать эту тему. Нам осталось только рассмотреть деструктор класса. Группа классов для работы со списками Список является более сложной организацией данных, чем массив. Список обычно можно разделить на две части. Часть первая это нелосредственно список. Обычно он хранит в себе указатели на первый и последний элементы списка, а также число элементов в списке. Иногда список включает в себя также число элементов списка и указатель на так называмый текущий элемент, т. активный в настоящий момент элемент. Часть вторая это множество элементов списка. Каждый элемент списка, в свою очередь, включает по меньшей мере три указателя. Первый указатель это указатель на предыдущий элемент списка. Второй указатель это указатель на следующий элемент списка. Третий указатель указывает на какие. Подобная организация данных позволяет выстраивать длинные цепочки данных и осуществлять перебор элементов в любом направлении. При необходимости можно легко добавить элемент в любое место списка и исключить любой элемент из списка. Для того чтобы произвести подобные действия, нужно всего. Однако эта легкость обеспечивается тем, что для объединения элементов в цепочку . При достаточно большом размере списка расходы памяти, необходимые для хранения дополнительных указателей, также становятся достаточно большими. Это является крупным недостатком подобной организации данных. Но это только теоретические принципы построения списков. Конкретные реализации списков могут заметно отличаться друг от друга. Посмотрим, каким образом организован список в . Эти классы отличаются друг от друга только некоторыми деталями, однако, принципы функционирования объектов этих классов остаются очень схожими между собой. Поэтому, как и в случае с массивами, рассмотрим наиболее универсальный класс, . Думаю, что читатель, понимающий принципы организации списков в . Эта структура, вероятно, описывает элемент списка. Для того чтобы создать объект класса . Исходный текст конструктора класса находится в файле . Размер блока по умолчанию равен . Понимая значения защищенных . Получить число элементов списка можно при помощи метода . Текст другого метода, . если в списке нет элементов. Для того чтобы иметь возможность добавить элемент в список, нужно научиться создавать этот элемент Элемент может быть создан при помощи метода . Исходный код этого метода находится в файле . А вот дальше, как и при изучении массивов, начинается самое интересное. Оказывается, для того чтобы можно было создать элемент, должен существовать какой. Откуда же берется этот свободный элемент. Посмотрим, что происходит в том случае, когда указатель на свободный элемент равен . Если указатель на свободный элемент равен . Эта структура в файле . Функция выделяет память для размещения структуры типа . Мы можем это поле назвать приращением списка. Этот этап создания списка схематически изображен на рис. После того как память выделена, функция связывает указатель на только что созданную структуру и следующие за ней . Для связки используется поле . Второй этап создания списка я также изобразил на рис. Но вернемся в метод . Используя этот указатель, метод . При этом связывание опять осуществляется в реверсивном порядке, а для связки используется поле . Таким образом мы вычислили, что помимо непосредственно списка данных в классе . Ну, а теперь нет ничего проще, чем начальный элемент списка свободных . Это делается, как я уже говорил, корректурой нескольких указателей. Естественно, указатель на свободную . Указатель на даннью элемента . Но внимательный читатель тут же задаст мне вопрос как же так, ведь, исходя из текста метода, корректируются указатели только в созданном элементе, но указатели элементов списка остаются неизменными. А как быть в том случае, если мы добавляем вновь созданный элемент в середину списка. Он должен вызываться только другими методами класса. Но для того, чтобы продолжить рассказ, я должен вкратце рассказать еще об одной вещи. Дело в том, что методы списка в большинстве своем начинают работу с того элемента, положение которого характеризуется некой величиной, переменной типа . Фактически этой величиной является указатель на элемент, однако этот тип в файле . Здесь я хотел бы обратить внимание читателя на один момент, важный для понимания смысла положения элемента. Предположим, что положение это не что иное, как своеобразный указатель на текущий элемент. Воспринимая положение как указатель на текущий элемент, можно облегчить себе понимание работы со списком. Естественно, в программе можно завести массу переменных типа . Но ведь это же фактически является созданием списка со многими указателями, не так ли. Использование в программе нескольких переменных типа . Теперь можно вернуться к вашему вопросу. Он используется другими методами, предназначенными для добавления элемента в список, например, методом . А присоединение как раз и заключается в корректировке указателей. Возвращаемым значением является указатель на новый элемент. Думаю, что я ответил на . Вставить новый элемент ПЕРЕД текущим элементом можно при помощи метода . Во время работы метод создает новый элемент при помощи метода . Совершенно аналогичным образом работает метод . Различия между исходными кодами этих методов крайне незначительны. Научившись создавать список и добавлять в него элементы поодиночке, можно рассмотреть и добавление к списку другого списка. Точно так же метод . Теперь мы знаем, каким образом необходимо осуществлять добавление к списку новых элементов и других списков. Наверное, неплохо было бы узнать о том, каким образом можно осуществить выборку того или иного элемента, чем мы сейчас и займемся. Для того чтобы получить данные из элемента, необходимо воспользоваться методом . В свою очередь, метод . Перебрать все элементы списка, начиная с текущего и заканчивая конечным, можно при помощи метода . Точно так же метод . В обычных условиях перебор всех элементов списка может производиться с одной из двух целей либо нам нужно составить полную сводку по данным, хранящимся в списке .