Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.17 Mб
Скачать

5.4Объекты в объектах

Часто одни объекты содержат явно другие объекты или же создают другие объекты вне себя с помощью операторов new или gcnew. В первом случае объявленный в классе объект создаётся автоматически (instantiate) на языке C++/CLI. Во втором случае объект явно создаётся в куче - с помощью оператора new на языках Java и C# и с помощью операторов new или gcnew на языке C++/CLI. Затем объект используется и, в конце концов, потом удалится оператором delete из неуправляемой кучи или сборщиком мусора из управляемой кучи.

Пример 5.4.1. Объект содержит объект другого класса.

////////////////////

// C++/CLI

#include "stdafx.h"

using namespace System;

class A // Описание класса А

{

int x; // Закрытая переменная x

public:

char y; // Открытая переменная у

void Set (int x, char y) {A::x= x; A::y= y;}

void Show ()

{

System::Console::Write ("x= {0} y= ", x.ToString());

System::Console::WriteLine (gcnew Char (y));

}

};

class В // Описание класса В

{

float f; // Закрытая переменная f

A a; // Объявлен объект а класса А внутри объекта класса В

public:

void Set (float f, int x, char у)

{ В::f=f; a.Set (x, у);} // Установка значения f класса В и данных

// объекта а класса А через его функцию Set()

void Show ()

{

System::Console::Write ("f= {0} ", f.ToString());

a.Show (); // Здесь выдаются данные объекта а на консоль

// с помощью его функции Show()

}

};

int main(array<System::String ^> ^args) // Функция main видна в файле

{

A objA;

objA.Set(1, 'c'); // Установить значения данных объекта objA

objA.Show(); // Показать значения данных объекта obJA

В objB; // Объект objB класса В в стеке

objB.Set(10.5, 2, 'd'); // Установить значения данных объекта objB

objB.Show(); // Показать значения данных объекта objB

}

Результат:

x= 1 y= c

f= 10,5 x= 2 y= d

Функция

Void Show ()

{

System::Console::Write ("x= {0} y= ", x.ToString());

System::Console::WriteLine (gcnew Char (y));

}

может быть реализована и попроще (ОВН):

Void Show ()

{

System::Console::WriteLine ("x= {0} y= {1}", x.ToString(),Char (y));

}

В приведённой программе на языке C++/CLI объект objB содержит объект а. Функция Set() класса В устанавливает значение закрьггой переменной f этого класса и устанавливает значения данных включённого объекта а, используя функцию Set() объекта а. Обратите внимание, что в область видимости функции Set(float f, int x, char у) класса В входят переменная f и объект а, а в область видимости функции Set(int x, char у) класса А входят переменные x и у. К недоступным для неё переменным x и у функция Set(float f, int x, char у) обращается через доступный объект а, конкретнее, посредством его открьтгой функции Set(int x, char у).

Взаимосвязь классов программы примера 5.4.1 можно представить в виде диаграммы классов рис 5.4.1. Класс В связан с классом А отношением композиции, указывающей, что объект класса В является владельцем объекта класса А.

На так называемой диаграмме последовательности (рис. 5.4.2) показана последовательность выполнения действий в нашей программе. Наверху слева диаграммы находится фиктивный объект :main, пунктирная вертикальная линия, исходящая из него вниз, - это линия жизни этого объекта (время изменяется сверху вниз). Вертикальный прямоугольник на этой линии - выполнение функции main(), которая автоматически создаёт (instantiate) объявленные в ней объекты objA:A и objB:B, затем устанавливает значения объекта objA:A и выдаёт эти значения на экран, используя соответствующие функции объекта objA:A. Потом выполняются аналогичные действия с объектом objB:B. При завершении функции main() объект :main уничтожается, при этом автоматически уничтожаются и находящиеся в нём объекты objA:A и objA:A. Уничтожение объектов показано крестом.

Рис. 5.4.1. Диаграмма классов примера 5.4.1

Рис. 5.4.2. Диаграмма последовательности программы примера 5.4.1