Студопедия — Функции, дружественные нескольким классам
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Функции, дружественные нескольким классам






Функция может быть дружественной сразу нескольким классам. В приведённом ниже примере реша­ется задача вычисления координат конца заданного вектора, начало которого находится в заданной точке.

Файл DotVec.h
#include<iostream.h>; // содержит функции ввода-вывода

#include<windows.h>; // содержит функцию CharToOem

#include<math.h>; // содержит математические функции

class Vec; // неполное объявление класса вектора

class Dot // класс точки

{

const char name; // имя точки

double x, y; // координаты точки

public:

Dot (char Name): name (Name) { x = 0; y = 0; }

Dot (char Name, double X, double Y): name (Name) { x = X; y = Y; }

inline double GetX () const { return x; }

inline double GetY () const { return y; }

inline void SetX (double X) { x = X; }

inline void SetY (double Y) { y = Y; }

// вычисляет координаты конца заданного вектора

void EndVec (const Dot & A, const Vec & AB); // функция-член класса Dot // объявление дружественной функции

friend void EndVec (const Dot & A, const Vec & AB, Dot & B);

• • •
}
;

class Vec // класс вектора

{

char name [ 3 ]; // имя вектора

double x, y; // проекции вектора

public:

// конструкторы класса Vec

Vec (char * pName) { strncpy (name, pName, 3); x = 0; y = 0; }

Vec (char * pName, double X, double Y) { strncpy (name, pName, 3); x = X; y = Y; }

Vec (char * pName, Dot A, Dot B); // конструирование вектора по координатам его концов

double GetX () const { return x; }

double GetY () const { return y; }

// вычисляет координаты конца заданного вектора

void EndVec (const Dot & A, Dot & B); // функция-член класса Vec

// объявление дружественной функции

friend void EndVec (const Dot & A, const Vec & AB, Dot & B);

• • •
}
;

Файл DotVec.cpp
#include "DotVec.h"; // подключение заголовочного файла DotVec

// три функции вычисляют координаты конца заданного вектора

void Dot:: EndVec (const Dot & A, const Vec & AB) // описание функции-члена класса Dot

 
Объектно-ориентированное программирование

{


Лекция 4


Дружественные функции и классы



x = A.x + AB.GetX ();

y = A.y + AB.GetY (); }

void Vec:: EndVec (const Dot & A, Dot & B) // описание функции-члена класса Vec

{

B.SetX (A.GetX () + x);

B.SetY (A.GetY () + y); }

void EndVec (const Dot & A, const Vec & AB, Dot & B) // описание дружественной функции {

B.x = A.x + AB.x;

B.y = A.y + AB.y; }

Файл Main.cpp
#include "DotVec.h"; // подключение заголовочного файла DotVec

void main () {

Dot A ('A', 3, 4), B ('B',-3, 4); // вызов конструктора Dot (char Name, double X, double Y)
Dot C ('C'), D ('D'); // вызов конструктора Dot (char Name)

Vec AB ("AB", A, B); // вызов конструктора Vec (char * pName, Dot A, Dot B)

Vec AC ("AC", 2, 2); // вызов конструктора Vec (char * pName, double X, double Y)

C.EndVec (A, AC); // вызов функции Dot:: EndVec (const Dot & A, const Vec & AB)

AC.EndVec (A, C); // вызов функции Vec:: EndVec (const Dot & A, Dot & B)

EndVec (A, AC, C); // вызов дружественной функции

} // EndVec (const Dot & A, const Vec & AB, Dot & B)

Эта программа демонстрирует важный случай применения неполного объявления класса: без приме­нения этой конструкции в данном случае было бы невозможно объявить дружественную функцию для двух классов. Неполное объявление класса Vec дает возможность использовать его имя в объявлении дружественной функции еще до то определения. Необходимо отметить, что при неполном объявлении класса объявления классов должны находиться в одном заголовочном файле, в данном случае DotVec.h. В приведенном примере объявлены классы точки Dot и вектора Vec и поставленная задача решена тремя различными способами.

Функция void Dot:: EndVec (const Dot & A, const Vec & AB) является членом класса Dot, получает константные ссылки на вектор и начало вектора и передаёт координаты конца вектора в текущую точку. Поскольку закрытые члены-данные класса Vec недоступны в классе Dot, то мы используем открытые функции-члены класса VecGetY () и GetX (). Функция-член класса вызывается оператором: C.EndVec (A, AC), где объект C является текущим, а объекты A и AC – параметрами.

Функция void Vec:: EndVec (const Dot & A, Dot & B) является членом класса Vec, получает кон­стантную ссылку на начало вектора и ссылку на конец вектора. При вычислениях используются значения проекций текущего вектора. Поскольку закрытые члены-данные класса Dot недоступны в классе Vec, то мы используем открытые функции-члены класса DotGetX (), GetY (), SetX (), SetY (). Функция-член класса вызывается оператором: AC.EndVec (A, C), где объект AC является текущим, а объекты A и C – параметрами.

Функция friend void EndVec (const Dot & A, const Vec & AB, Dot & B) является дружественной классам Dot и Vec. Для этого она объявлена в обоих классах с ключевым словом friend. Функция получа­ет константные ссылки на начало вектора и вектор, а также ссылку на конец вектора. Поскольку закрытые данные-члены обоих классов Dot и Vec доступны дружественной функции, то мы используем оператор “точка” для доступа к этим данным. Дружественная функция вызывается оператором EndVec (A, AC, C).







Дата добавления: 2015-10-01; просмотров: 502. Нарушение авторских прав; Мы поможем в написании вашей работы!



Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

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

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

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

Индекс гингивита (PMA) (Schour, Massler, 1948) Для оценки тяжести гингивита (а в последующем и ре­гистрации динамики процесса) используют папиллярно-маргинально-альвеолярный индекс (РМА)...

Методика исследования периферических лимфатических узлов. Исследование периферических лимфатических узлов производится с помощью осмотра и пальпации...

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

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит...

Кран машиниста усл. № 394 – назначение и устройство Кран машиниста условный номер 394 предназначен для управления тормозами поезда...

Приложение Г: Особенности заполнение справки формы ву-45   После выполнения полного опробования тормозов, а так же после сокращенного, если предварительно на станции было произведено полное опробование тормозов состава от стационарной установки с автоматической регистрацией параметров или без...

Studopedia.info - Студопедия - 2014-2024 год . (0.012 сек.) русская версия | украинская версия