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

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

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






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

Файл 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; просмотров: 495. Нарушение авторских прав; Мы поможем в написании вашей работы!



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

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

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

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

Билет №7 (1 вопрос) Язык как средство общения и форма существования национальной культуры. Русский литературный язык как нормированная и обработанная форма общенародного языка Важнейшая функция языка - коммуникативная функция, т.е. функция общения Язык представлен в двух своих разновидностях...

Патристика и схоластика как этап в средневековой философии Основной задачей теологии является толкование Священного писания, доказательство существования Бога и формулировка догматов Церкви...

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

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

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

Случайной величины Плотностью распределения вероятностей непрерывной случайной величины Х называют функцию f(x) – первую производную от функции распределения F(x): Понятие плотность распределения вероятностей случайной величины Х для дискретной величины неприменима...

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