Смекни!
smekni.com

Проектирование и разработка классов средствами языка программирования С++Builder6/0 (стр. 2 из 4)

Данные класса называют полями, а функции класса - методами. Поля и методы называют элементами класса. Описание класса в первом приближении выглядит так:

сlass <имя>

{ [private:]

// описание скрытых элементов

Public:

// описание доступных элементов

}; // описание заканчивается точкой с запятой

Спецификаторы доступа private и public управляют видимостью элементов класса. Элементы, описанные после служебного слова private, видимы только внутри класса. Этот вид доступа принят в классе по умолчанию. Интерфейс класса описывается после спецификатора public. Действие любого спецификатора распространяется до следующего спецификатора или до конца класса. Можно задавать несколько секций private и public, порядок их следования значения не имеет.

Поля класса могут:

иметь любой тип, кроме типа этого же класса (но могут быть указателями или ссылками на этот класс);

быть описаны с модификатором const, при этом они инициализируются только один раз и не могут изменяться;

быть описаны с модификатором static.

Классы могут быть глобальными (объявленными вне любого блока) и локальными (объявленные внутри блока, например функции или другого класса).

Ниже приведены некоторые особенности локального класса:

внутри локального класса можно использовать типы, статические (static) и внешние (extern) переменные, внешние функции и элементы перечислений из области, в которой он описан; запрещается использовать автоматические переменные из этой области;

локальный класс не может иметь статических элементов;

методы этого класса могут быть описаны только внутри класса;

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

В качестве примера создадим класс, моделирующий комплексные числа, записываемые в виде а + bi, где а-действительная часть, а b-мнимая.

class Complex // комплексные числа

{

private: int a;

int ib;

public:

void setcomplex (int x, int y) // установка значений поля

{a = x; ib=y; }

void getcomplex () // ввод полей с клавиатуры

{cout<<”&bsol;n Введите действительную часть"; cin>>а;

cout<<”&bsol;n Введите мнимую часть"; cin>>ib;

}

int get_a () {return a; }

int get_ib () {return ib; }

void show () const

{ cout<<a<<" + "<<ib<<"i"; } // вывод полей на экран

};

В этом классе два скрытых поля a и ib, получить значения которых из вне можно с помощью методов get_a () и get_ib ().

1.3 Описание объектов

Конкретные переменные типа "класс" называются экземплярами класса, или объектами. Время жизни и видимость объектов зависит от вида и места их описания и подчиняется общим правилам C++.

Complexz1; // объект класса Complex с параметрами по умолчанию

Complexz2 (12,14); // объект с явной инициализацией

Complexarray_of_complex [100] ; // массив объектов с параметрами по умолчанию

Complex*z = newComplex (10); // динамический объект

Complex &z3 = z1; // ссылка на объект

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

Доступ к элементам объекта аналогичен доступу к полям структуры. Для этого используется операция точка () при обращении к элементу через имя объекта и операция - > при обращении через указатель, например:

int n = z1. get_a ();

cout<<z->get_ib ();

Обратиться таким образом можно только к элементам со спецификатором public. Получить или изменит значения элементов со спецификатором private можно только через обращение к соответствующим методам.

Можно создать константный объект, значения полей которого изменять запрещается. К нему должны применяться только константные методы:

ClassComplex

{

intget_a () const {returna; }

};

const Complex z (0,0); // константный объект

cout<<z. get_a ();

Константный метод:

Объявляется с ключевым словом const после списка параметров;

Не может изменять значений полей класса;

Может вызывать только константные методы;

Может вызываться для любых (не только константных) объектов.

1.4 Конструкторы

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

Конструктор не возвращает значение, даже типа void. Нельзя получить указатель на конструктор.

Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации (при этом используется механизм перегрузки).

Конструктор, вызываемый без параметров, называется конструктором по умолчанию.

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

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

Конструкторы не наследуются.

Конструкторы нельзя описывать с модификаторами const, virtual и static.

Конструкторы глобальных объектов вызываются до вызова функции main.

Локальные объекты создаются, как только становится активной область их действия.

Конструктор запускается и при создании временного объекта.

Конструктор вызывается, если в программе встретилась какая-либо из синтаксических конструкций:

имя класса имя_объекта [ (список параметров)] ;

// список параметров не должен быть пустым

имя_класса (список параметров);

// создается объект без имени (список может быть пустым)

имя класса имя_объекта = выражение;

// создается объект без имени и копируется

Примеры:

Complex z1 (10,11), z2;

Complex z = Complex (100, 200);

В первом операторе создаются два объекта. Значения не указанных параметров устанавливаются по умолчанию.

Во втором операторе создается безымянный объект, выделяется память под объект z, в которую копируется безымянный объект.

В качестве примера класса с несколькими конструкторами усовершенствуем класс Complex.

class Complex

{

private: int a;

int ib;

public: Complex (): a (0), ib (0) // конструктор без аргументов

{}

Complex (int za, int zib): a (za), ib (zib) // конструктор с двумя аргументами

{}

voidshow () const // вывод комплексного числа на экран

{ cout<<a<<" + "<<ib<<"i"; } };

2. Предложения по решению поставленной задачи

2.1 Предметная область программирования. Ветровой режим

Основными характеристиками, описывающими ветровой режим являются скорость (V км/час) и направление (0˚<dd<360˚).

Форма следующая: dd-V.

Например, скорость ветра равна 50 км/ч и направление 120˚ должны быть записаны как 120 град. - 50 км/ч.

2.2 Атрибуты и методы класса. UML-диаграмма

Согласно условию задачи, необходимо создать класс wind, содержащий два поля типа int (направление и скорость ветра соответственно), константные методы вывода значений характеристик ветра в формате (dd-V), а также каждой характеристики в отдельности и метод, позволяющий вычислить значения составляющих скорости. Инициализация объекта должна осуществляться конструкторами: по умолчанию (присваивает полям нулевые значения), с двумя параметрами.

Ключевым принципом ООП является инкапсуляция и возможность сокрытия данных. Т.е. данные заключены внутри класса и защищены от несанкционированного доступа. Статус доступа определяется ключевыми словами: public (общедоступный), private (закрытый), protected - (защищенный). По умолчанию элементы класса имеют закрытый статус доступа.

Если методы класса определены внутри класса, то они являются встраиваемыми. Методы класса могут быть лишь объявлены внутри класса, а определены вне его.

На рисунке 2 представлена UML-диаграмма проектируемого класса wind.



Рисунок 1 - UML-диаграмма класса wind

Чтобы приступить к написанию класса необходимо ознакомиться с окном редактора кода C++ Builder. Редактор кода в C++ Builder при просмотре программного модуля имеет три страницы, закладки которых вы можете видеть в нижней части окна. Две из них отображают коды файла реализации (kursOOP1. cpp) и заголовочного файла (kursOOP1. h). Страница Diagram позволяет строить диаграммы, иллюстрирующие взаимоотношения компонентов в приложении. В заголовке окна редактора кода отображается имя файла реализауции того модуля, с текстом которого вы работаете. Закладки в верхней части окна позволяют переключаться с одного модуля на другой, если в вашем проекте несколько модулей. Если в какой-то из открытых модулей вам больше не нужен, вы можете закрыть его страницы, выбрав в контекстном меню команду ClosePage. Вы можете также открыть дополнительное окно редактора кода и одновременно работать с несколькими модулями или с разными фрагментами одного модуля. В нижней части окна вы можете увидеть типичную для текстовых редакторов строку состояния. В самой левой ее части находится индикатор строки и колонки. Правее расположен индикатор модификации, который словом Modified показывает, что код, который вы видите в окне, изменен и не совпадает с тем, который хранится на диске. В окно редактора также встроена контекстная справка, чтобы ее получить, достаточно установить курсор на интересующее вас слово и нажать клавишу F1.

Рассмотрим подробнее компоненты разрабатываемого класса.

Поля:

Поле dd типа int. Осуществляет хранение значений направления (0˚<dd<360˚).

Поле V типа int. Содержит значение модуля скорости ветра (V км/час).