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

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

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






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

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



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

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

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

ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...

Различие эмпиризма и рационализма Родоначальником эмпиризма стал английский философ Ф. Бэкон. Основной тезис эмпиризма гласит: в разуме нет ничего такого...

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

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

Демографияда "Демографиялық жарылыс" дегеніміз не? Демография (грекше демос — халық) — халықтың құрылымын...

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

ЛЕЧЕБНО-ПРОФИЛАКТИЧЕСКОЙ ПОМОЩИ НАСЕЛЕНИЮ В УСЛОВИЯХ ОМС 001. Основными путями развития поликлинической помощи взрослому населению в новых экономических условиях являются все...

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