Введение. Некоторые рекомендации по созданию классов

Глава 3

Пр.2.12.

Некоторые рекомендации по созданию классов.

Пр. 2.9

Динамические объекты. Деструкторы.

Отличия виртуальных и динамических методов.

Совместимость формальных и фактических параметров.

Совместимость между объектами и указателями на объект.

Совместимость классов.

Заключение.

Положительные стороны использования статических методов:

1) быстрый вызов (нет никаких таблиц, никаких пересылок)

2) не требуется для каждого объекта хранить адрес таблиц виртуальных методов и не требуется для классов хранить VMT.

Положительные стороны виртуальных методов:

1) универсальность программы

2) возможность использования уже оттранслированных методов для работы с новыми объектами.

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

Совместимость может быть трёх видов:

1) Между объектами.

2) Между указателями на объект.

3) Между формальными и фактическими параметрами методов.

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

Форм.= фактич.

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

void Show (tPoint t);

{

……..

}

{

- show(loc);

+ show(p);

+ show(El);

}

Основное отличие от виртуальных методов заключается в основном в структуре внутренних таблиц компилятора. Для динамического метода компилятор строит таблицу динамических методов ДМТ. Применение динамических методов уменьшает размер памяти, используемой прикладной программой при работе с объектами. Но при этом программа будет работать медленно. Во все других отношениях они аналогичны виртуальным.

Динамический метод может присутствовать как в статических, так и в динамических объектах. Работа с динамическими объектами аналогична работе с переменными любого другого типа. Те же процедуры (New, dispose). Деструктор является противоположностью конструктора. Он вызывается при уничтожении объектов и должен производить необходимую очистку объекта перед освобождением занимаемой им памяти. Именем деструктора должно быть имя класса, которому предшествует тильда (~).

struct ptlocation {

ptPoint=^tPoint;

tlocation=

tPoint=

}

ptPoint pp1, pp2;

{

……..

pp1 = new ptPoint;

pp1->Init();

pp1->Move;

pp1 pp1 VMT

 
 


При использовании динамических объектов лучше использовать расширенный синтаксис процедур New и delete

New

Первое расширение: процедуру new можно использовать как функцию.

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

Delete

Допускается второе расширение new, но в качестве второго параметра указывается имя деструктора

Пр.2.10

struct см.2.9

{

Pp1 = new tPoint;

Pp2 = new (Init(300, 200, 15));

pp2 VMT

Delete(pp2);

При работе с динамическими объектами используются 1 – new, 2 – delete.

Деструкторы – специальный вид метода, предназначенный для удаления динамических объектов и освобождения занимаемой ими памяти.

Их можно перекрывать и наследовать. Аналогично конструкторам, для которых в каждом классе рекомендуется использовать одинаковое имя (Init) для деструкторов рекомендуется использовать одинаковое имя Done.

Так как для различных классов чаще всего требуются различные методы освобождения памяти, то рекомендуется всегда объявлять деструкторы виртуальными и располагать деструктор в самом общем родительском классе. При необходимости использовать в каком – либо классе свой деструктор, его можно перекрыть обычным модулем. Деструктор имеет смысл использовать с динамическими объектами. Деструкторы выполняют специальные действия, которые гарантируют правильное освобождение памяти объектов, созданных при позднем связывании деструктор следует связывать используя расширенный синтаксис(dispouse(pp1, Done)) процедуры Dispouse. В этом случае вызов деструктора вне процедуры dispouse не произведёт никаких действий. Деструктор обычно бывает пустой процедурой.

Destructor tlocation::Done

{

}

В этом случае деструктор выполняет только свои системные функции:

1) Поиск по таблице виртуальных методов, размера памяти, занимаемой объектом, на который ссылается указатель, записаны в процедуре delete.

2) Передача этого размера в процедуру delete.

Таким образом delete освобождает правильное число байт не зависимо от того ссылается ли указатель на объект родительского класса.

В структуре класса желательно включать все действия в виде методов, который может проделывать объект данного класса, даже если какие – то действия не будут использоваться в данной программе. В процессе компиляции компилятор размещает в памяти коды только тех методов, вызов которых встречается в программе. Ни разу не вызванные методы компилятором игнорируются. Лишние емтоды память не занимают. Обычно описание классов и методов оформляют в виде отдельных модулей.

Добавим в описание класса tlocation методы GetX, GetY, которые будут возвращать координаты центра.

class tlocation {

int x, y: integer;

int GetX(); виртуальными делать не надо, так как они не зависят от того, каой объект их вызывает.

int GetY();

Move; - вирт.

Hide; - вирт.

Draw; - вирт.

~tlocation();

};

C++ Builder.

Builder – система программирования, продукт Borland. Относится к классу инструментальных средств быстрой разработки приложения. Cистема объектно-ориентированного программирования C++ Builder производства корпорации Borland предназначена для операционных систем Windows 95 и NT. Интегрированная среда C++ Builder обеспечивает скорость визуальной разработки, продуктивность повторно используемых компонент в сочетании с мощью языковых средств C++, усовершенствованными инструментами и разномасштабными средствами доступа к базам данных.

C++ Builder может быть использован везде, где требуется дополнить существующие приложения расширенным стандартом языка C++, повысить быстродействие и придать пользовательскому интерфейсу качества профессионального уровня.

В сочетании с мощью языка C++ среда C++ Builder является высокопроизводительной системой, предназначенной для быстрой разработки сложных приложений, ориентированных на работу с графикой, с базами данных и в компьютерных сетях. C++ Builder поддерживает технологию RAD [Rapid Application Development], в основе которой визуальное проектирование программы из достаточно крупных деталей - компонентов и последующего налаживания их взаимодействия.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: