сумма – float
10.ЦЕХ имя – char*
начальник – char* количество работающих – int
11.ПЕРСОНА имя – char*
возраст – int
пол – int(bool)
12.АВТОМОБИЛЬ марка – char* мощность – int стоимось – float
13.СТРАНА
имя – char*
форма
правления – char* площать – float
14.ЖИВОТНОЕ имя – char*
класс – char* средний вес – int
15.КОРАБЛЬ имя – char*
водоизмещение – int
тип – char*
4. Контрольные вопросы.
1.Что такое конструктор? Для чего он используется? 2.Что такое деструктор? Какой формат его описания?
3.Как определяется указатель на компоненту-функцию?
4.Как определяется указатель на экземпляр класса?
Лабораторная работа №3. Структура класса компонента.
1.Цель лабораторной работы.
Целью лабораторной работы является освоение практических навыки создания иерархии классов и использования статических компонентов класса.
2.Теоретический материал для домашнего изучения.
Заготовка модуля компонента, созданная в результате указанных ранее действий, имеет следующий вид.
Файл EditLetNum.h: #ifndef EditLetNumH fdefine EditLetNumH
// ---------------------------------------------------------------
finclude <SysUtils.hpp> linclude<Controls.hpp> linclude <Classes.hpp> #include <Forms.hpp> finclude <StdCtrls. hpp>
// ---------------------------------------------------------------
class PACKAGE TEditLetNum : public TEdit
{
private:
protected:
public:
__fastcall TEditLetNum(TComponent* Owner); __published:
}; // ---------------------------------------------------------------
#endif
Файл EditLetNum.cpp: tinclude <vcl.h> #pragma hdrstop finclude "EditLetNum.h"
#pragma package(smart_init)
// -------------------------------------------------------------
//(Функция ValidCtrCheck используется для проверки того,
//что компонент не содержит чистых виртуальных функций)
static inline void ValidCtrCheck{TEditLetNum *)
{
new TEditLetNum(NULL);
}
// ---------------------------------------------------------------
__fastcall TEditLetNum::TEditLetNum(TCompanent* Owner) : TEdit(Owner)
{
}
// ---------------------------------------------------------------
namespace Editletnum {
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TEditLetNum)};
RegisterComponents("Мои компоненты", classes, 0);
}
}
Собственно говоря, в этой заготовке пока только каркас класса будущего модуля. Файл EditLetNum.cpp содержит три процедуры:
ValidCtrCheck, конструктор TEditLetNum и Register. Процедура
ValidCtrCheck носит вспомогательный характер и вводится, чтобы проверять, не содержит ли компонент чистых виртуальных функций. Тело
конструктора TEditLetNum пока пустое. Позднее оно будет заполнено. А
процедуру Register, регистрирующую компонент на заданной странице библиотеки.
Код регистрации компонента начинается с оператора namespace.
Ключевое слово namespace устанавливает локальность имен данной процедуры регистрации. После этого ключевого слова следует имя файла,
содержащего компоненты. Имя пишется символами в нижнем регистре,
кроме первой заглавной буквы.
В процедуре регистрации Register первый оператор создает массив регистрируемых компонентов classes тнпа TComponentClass и заносит в него регистрируемый компонент. Если бы вы создали два компонента
(пусть имя второго из них TEdit2), регистрируемых на одной странице библиотеки, вы моглн бы занести их в массив оператором:
TComponentClass classes [2] = {__classid(TEditLetNum), __classid(TEdit2)};
Следующий оператор процедуры регистрации регистрирует функцией
RegisterComponents компоненты, занесенные в classes (второй параметр функции) на странице Мои компоненты (первый параметр). Последний параметр является последним индексом массива регистрируемых компонентов.
Теперь рассмотрим коротко описание класса в заголовочном файле
EditLetNum.h. В нем есть разделы private, protected, public и __published.
Они определяют четыре варианта доступа к переменным, процедурам и функциям:
private |
Процедуры и функции, определенные таким |
(закрытые) |
образом, доступны только в пределах данного |
|
модуля. |
|
|
protected |
Процедуры и функции, определенные таким |
(защищенные) |
образом, доступны в классах потомков. |
|
|
public (открытые) |
Эти процедуры и функции доступны везде. |
|
|
__published |
Процедуры и функции доступны везде и |
(опубликованные) |
имеют связь со средой разработки C++Builder, |
|
обеспечивающую вывод на экран в |
|
Инспекторе Объектов страниц информации о |
|
свойствах и событиях. |
|
|
Определение объекта (компонент — это объект) выступает как совокупности свойств, методов и обработчиков событий. Причем свойства
— это совокупность полей данных и методов их чтения и записи.
Вспомним также принцип скрытия информации. Исходя из этого,
разработчик компонента должен продумать, в какие разделы вставить вводимые им поля данных, свойства и методы.
Задание свойств
Поля данных всегда должны быть защищены от несанкционированного доступа. Поэтому их целесообразно определять в private — закрытом разделе класса. В редких случаях их можно помещать в protected —
защищенном разделе класса, чтобы возможные потомки данного класса имели к ним доступ. Традиционно идентификаторы полей совпадают с именами соответствующих свойств, но с добавлением в качестве префикса символа ―F‖. Таким образом, в нашем примере вы можете занести в раздел private объявления трех необходимых нам полей данных:
class PACKAGE TEditLetNum : public TEdit
{
private: