Материал: Лаб. 2 (new)

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Лабораторная работа №2. Отношение включения. Постановка задачи.

Разработать определения двух класса “Класс №1” и “Класс №2”, которые связаны отношением включения. Поля разрабатываемых классов считаются заданными и приводятся в таблице. Для всех классов требуется написать три вида конструкторов (умолчания, с параметрами и конструктор копирования), деструктор, перегруженный оператор присваивания, методы доступа и метод print(), распечатывающий значения полей объекта. Написать тестовую программу для проверки работоспособности разработанных классов.

*C”ИМЯ КЛАССА” (ИМЯ КЛАССА) >> Свойства класса.

Вариант

*

Класс №1

Свойства

(Класс №1)

Класс №2

Свойства

(Класс №2)

1

СGroup

(Группа)

Int NumberGr

(Номер группы, например – 84)

String NameGr

(Имя группы, наприер – ИКПИ)

CStudent

(Студент)

String Surname

(Фамилия, например – Иванов)

CGroup* G

2

CProfession (Профессия)

String Spec

(Специальность, например – Специалист по обеспечению безопасности на объекте)

Int Number

(Номер специальности в отделе, например – 03)

CWorker

(Сотрудник)

String Surname

(Фамилия, например – Иванов)

CProfession* P

3

CCharacteristic (Характеристика)

Float Bite

(Размер, например – 8)

String Format

(Формат, например – txt)

CFile

(Файл)

String Name

(Имя, например – Иван)

CCharacteristic * S

4

CWheel

(Колесо)

Float Diam (Диаметр, например – 23.5)

String NameBr

(Имя производителя колёс, например – Michelin)

CCar

(Машина)

String Brand

(Бренд, например – LADA)

CWheel* W

5

CComponent (Компонет)

Float Cost

(Цена, например – 87.7)

String Type

(Тип, например – пассивный компонент)

CRadioDetal (Радиодеталь)

String Name (Наименование, например – Транзистор)

CComponent* C

6

CAuthor

(Автор)

Char* Name

(Название, например – Капитанская дочка)

Int Pages (Число страниц, например – 370)

CBook

(Книга)

String Name

(Имя, например – Александр Сергеевич Пушкин)

CAuthor* A

7

CDescription (Описание)

String Name

(Название, например – Аватар)

Float Duration

(Продолжительность (в минутах), например – 186.5)

CFilm

(Фильм)

Double Rating (Рейтинг фильма, например – 8.61)

CDescription* D

8

СProperties (Свойства)

Int Number

(Номер в составе, например – 7)

String Type

(Тип, например – Сцепной)

СRailwayWagon (Железн. Вагон)

String Company

(Компания, например - Алтайвагон)

СProperties obj

9

CType

(Тип)

Float Long

(Длинна, например – 35.5)

String Brand

(Бренд, например – Airbus)

CAircraft

(Самолёт)

String Company

(Компания в которой используются, например – Аэрофлот)

CType* T

10

CDescription

(Описание)

String Type

(Тип, например – Логический)

String Class

(Классификация, например – Процедурный)

CLanguageProg

(Язык программ.)

String Name

(Название, например – Prolog)

CDescription* D

11

CCardClient

(Карта клиента)

Float Balance

(Баланс, например – 17789.9)

String Type

(Тип карты, например – Кредитная)

CClientBank

(Клиент банка)

String Name

(Название банка, например – Сбербанк)

CCardClient obj

12

CDetail

(Деталь)

String Brand

(Бренд, например – Nvidia)

String Name

(Название комплектующего, например – Видеокарта)

CParts

(Комплектующие)

Double Cost

(Цена, например – 16660.6)

CDetail obj

13

CDescription

(Описание)

Int Number

(Номер, например – 37)

String Comand

(Команда, например – Зенит)

CFootbalPlayer

(Игрок футбол.ком.)

String FullName

(Имя футболиста, например – Криштиану Роналду)

CDescription obj

14

CCharacteristic

(Характеристика)

Long Size

(Занимаемое пространство (в байтах), например – 542448800)

Float Cost

(Цена лицензии, например – 1990)

CProgramPocket

(Програм.пакет)

String Firm

(Компания, разработавшая, например – Microsoft)

CCharacteristic obj

15

CAdvertisement

(Объявление)

String Location

(Расположение (район), например – Выборгский)

Int Rooms (Число комнат, например – 2)

CApartment (Квартира)

Double Cost

(Цена квартиры (в млн. руб., например – 3.41)

CAdvertisement* A

16

CCharacteristic

(Характеристики)

String Model

(Модель телевизора, например – PHL42)

Float Diagonal

(Диагональ, например (в дюймах), например – 42)

CTV

(Телевизор)

Double Cost

(Цена, например -13990)

CCharacteristic obj

17

CData

(Данные)

Long Number

(Номер паспорта, например – 4013979478)

Char* FullName

(Полное имя держателя, например – Иванов Иван Иванович)

CPassport

(Паспортные дан.)

String Country

(Страна держателя, например – Россия)

CData* D

18

CCharacteristic

(Характеристики)

Float Display

(Диагональ (в дюймах), например – 4.0)

Int Battery

(Ёмкость аккумулятора (mAh), например – 4130)

CMobilePhone

(Мобильный тел.)

String Brand

(Производитель устройства, например – Samsung)

CCharacteristic obj

19

CLogs

(Данные)

Int Visitors

(Среднее число посетителей (в день), например – 32800)

String Host

(Хост, например – MacHost)

CWebsite

(Сайт)

String Name

(Название сайта, например – Ulmart)

CLogs* L

20

CDescription (Описание)

Long Weight

(Вес планеты (секстиллион. тонн), например – 5.97)

Bool Atmosphere

(Наличие атмосферы, например – Есть)

CPlanets

(Планеты СС)

String Name

(Название, например – Земля)

CDescription obj

21

CGuide

(Путеводитель)

Float Pricein

(Цена входа, например – 120)

String Locale

(Район расположения, например – Адмиралтейский)

CMuseumsSPB

(Музеи СПБ)

String Thematics

(Тематика, например – Исторический)

CGuide* G

22

CBrochure

(Брошюра)

Float Cost

(Цена билета, например – 890)

String Locale

(Расположение театра (проспект/улица), например – Рубиншейна)

CTheatresSPB

(Театры СПБ)

String Name

(Имя театра, например – МДТ)

CBrochure obj

23

CAdvertisement

(Объявление)

Int RatingStars

(Рейтинг (число звёзд), например – 5)

Float Cost

(Средняя цена (в сутки), например – 1790)

CHotelSPB

(Отели СПБ)

String Name

(Название, например – RadisonRoyal)

CAdvertisement obj

24

CCharacteristic

(Характеристики)

String Model

(Модель, например – SF950)

Int CameraMP

(Число мегапикселей камеры, например – 13)

CSmartphone

(Смартфон)

Double Cost

(Цена телефона, например – 13990)

CCharacteristic* С

25

CEngine (Двигатель)

Float Volume

(Мощность (л.с.), например – 150)

String Name

(Имя производителя, например – FORD)

CTransport (Транспортное ср. )

String Brand

(Бренд автомобиля, например – Rolls-Royce)

CEngine* E

26

CCharacteristic

(Характеристики)

Char* Processor (Производитель процессора, например – Intel)

String FormFactor

(Форм-фактор, например – Ультрабук)

CPersonalPC

(Персональный ПК)

String Brand

(Производитель компьютера, например – InvasionLabs)

CCharacteristic obj

27

CCharacteristic

(Характеристики)

String VideoCard

(Производитель видеокарты, например – Nvidia)

Float RAM

(Объем ОЗУ (Гб.), например – 8)

CNotebook

(Ноутбук)

String Brand

(Производитель ноутбука, например – Acer)

CCharacteristic* С

28

CCharacteristic

(Характеристики)

String Model

(Модель, например – SMOL50)

Float Cost

(Цена, например – 22990)

CTV

(Телевизор)

String Brand

(Производитель, например – Samsung)

CCharacteristic* C

29

CDescription (Описание)

String Class

(Класс, например – Папоротниковидные)

Bool Fertile

(Плодовитость, например – Истина)

CPlants

(Растение)

String Name

(Название, например – Туя обыкновенная)

CDescription* D

30

CDescription (Описание)

String Type

(Тип, например – Хищник)

Int Population

(Популяция (приблизительное число особей), например - 1690)

CAnimals (Животные)

String Name

(Название, например – Панда)

CDescription obj

Пример

CSpine

(Позвоночник)

Float LeightSpine

(Длинна позвоночника, например – 17)

String NameSpine

(Название позвонка, например - Шейный)

CMammal

(Млекопитающее)

Float WeightMammal

(Вес млекопитающего, например – 25)

CSpine* MammaFeatures

Методические указания.

В программе классы «действуют» не изолировано, а «вступают» в некоторые отношения друг с другом. Рассмотрим ряд таких отношений:

  • зависимость,

  • целое / часть, или включение, или агрегация,

  • композиция - частный случай агрегации,

  • наследование,

  • обобщение / специализация (в языке С++ - это частный случай наследования)

  • реализация

Отношение зависимость

Это один из наиболее слабых, но при этом и очень распространенный вид отношений между классами. Он предполагает, что один классов (зависимый класс) использует возможности, предоставляемые другим классом (независимым классом). Эта отношение на диаграммах классов в унифицированном языке моделирования отображается с помощью пунктирной линии, снабженной стрелкой. Эта линия имеет следующий вид -------->. Стрелка должна указывать на независимый класс. Например, такое отношение будет иметь между пользовательским классом complex и библиотечным классом istream в том случае, когда в классе complex для реализации функции – члена void complex :: input() будет использоваться библиотечный потоковый класс istream.

Для зависимости часто характерен кратковременный характер зависимости. Действительно, это имеет место в случае классов complex и istream. Зависимость проявляется только во время выполнения функции input().

Отношение целое / часть

Очень часто встречающийся вид отношения при работе на языке С++. Рассмотрим конкретный пример. Имеются два класса:

  • class room (комната),

  • class wall (стена).

Очевидно, что объект класса wall содержится в объекте класса room. Здесь объект класса room – целое, а объект класс wall – часть.

Часто это отношение справедливо называют агрегацией. На диаграммах классов UML отражают с помощью сплошной линией, которая заканчивается пустым ромбом. Ромб должен быть расположен в конце той части линии, которая находиться со стороны класса – агрегата.

Некоторые авторы — это же отношение называют включением. Рассмотрим конкретный пример. Пусть имеется класс A. Нашей задачей является разработка нового класса B, в котором предполагается воспользоваться возможностями, предоставляемыми классом B. Одним из возможных способов решить эту задачу является использование рассматриваемого вида отношения между класса. Причем возможны три варианта организации включения. Для каждого из этих вариантов для класса B выберем свое уточненное имя. В первом из вариантов в разделе реализации нового класса объявляется поле типа A (class B_1), во втором – поле типа A* (class B_2), а в третьем – поле типа A&(class B_3). Нашей задачей является рассмотрение особенностей организации конструкторов, деструктора и функции display(), выводящей на экран содержимое полей класса – агрегата.

class A

{

public:

A();

A(int n);

A(const A& rhs);

void display();

private:

int n_;

};

class B_1

{

// …

private:

A a_ ;

int m_;

};

class B_2

{

// …

private:

A* pa_;

int m_;

};

class B_3

{

private:

A& r_;

int m_;

};

Ограничимся рассмотрением организации классов B_1 и B_2, в которых используются нашедшие наиболее широкое применение варианты использования отношения включения. Реализацию класса A приводить не будем. Начнем с разработки класса B_1.

Разработка класса b_1.

Напишем вначале интерфейсную часть класса B_1.

// Файл B_1.h

class B_1

{

public:

B_1();

B_1(const A&, int m);

B_1(const B& rhs);

void display();

private:

A a_;

int m_;

};

Замечание. В интерфейс нового класса включен один из возможных вариантов реализации конструктора с параметрами: B_1(const A&, int m);

Перейдем к реализации класса B_1. Прежде всего, следует принять во внимание, что реализация должна находиться в отдельном файле с расширением .cpp. Выберем для него полное имя B_1.cpp. Будем учитывать много альтернативность возможных решений.

Начнем с рассмотрения возможных реализаций конструктора умолчания.

Конструктор умолчания.

Первый вариант реализации.

B_1 :: B_1() : m_(0) { }

Второй вариант реализации

B_1 :: B_1() : m_(0), a_() { }

Обсуждение. Это эквивалентные реализации. В первом варианте отсутствуют элементы инициализации для пользовательского поля a_. В этом случае компилятор должен вызвать конструктор умолчания класса, к которому относится пользовательское поле (в рассматриваемом примере это класс A). Если бы в нашем примере в классе A не был бы предусмотрен такой конструктор, то было бы выдано сообщение об ошибке.

Конструктор с параметрами

Здесь можно также рассмотреть две реализации. В первой из них инициализация выполняется в строке инициализации, а во второй инициализация заменяется присваиваниями в теле конструктора.

Первый вариант реализации

B_1 :: B_1(const A& a, int m) : a_(a), m_(m) { }

Второй вариант реализации

B_1 :: B_1(const A& a, int m) {

a_ = a;

m_ = m; }

Обсуждение. Первый вариант реализации обладает заметными преимуществами по сравнению со вторым вариантом. Дело в том, что инициализация в этом случае выполняется вызовом конструктора копирования класса A. Этот вызов будет иметь место при компиляции выражения a_(a), находящегося в строке инициализации. Сложнее будет обстоять дело при компиляции присваивания вида a_ = a; Такое присваивание возможно только в том случае, когда уже существует объект, стоящий слева от оператора присваивания. Для этой цели компилятор вызывает конструктор умолчания класса A.

Конструктор копирования.

Ограничимся одним вариантом реализации – использования строки инициализации.

B_1 :: B_1(const B_1& rhs) : a_(rhs.a_), m_(rhs.m_) { }

Рекомендация 1. В конструкторах предпочитайте инициализацию присваиванию.

Рекомендация 2. В строке инициализации записывайте отдельные элементы списка инициализации в том порядке, в котором появляются инициализируемые поля в объявлении класса. Заметим, что именно в этом порядке записаны элементы инициализации в рассмотренном примере. Дело в том, элементы строки инициализации выполняются в том порядке, в каком они объявляются, а в не том порядке, в котором они встречаются в строке инициализации.

Функция вывода на дисплей. display()

В теле этой функции следует вначале с помощью функции A :: display() вывести поля внутреннего объекта A :: a_, а затем собственного поля m_. Приведем реализацию этой функции.

void B_1 :: display() { a_.disply(); cout << “m = ” << m_ << endl; }