C, PHP, VB, .NET

Дневникът на Филип Петров


* Приятелски функции

Публикувано на 06 ноември 2008 в раздел С/С++.

Приятелски се наричат функциите, които не са член-функции на клас, но имат достъп до неговите private елементи. Приятелски функции се използват, когато е необходимо една функция да има достъп до private членовете на два или повече различни класа. Декларацията на приятелската функция може да се намира както в частта public, така и в частта private и се характеризира с ключовата дума friend, която се поставя в началото на декларацията. Една приятелска функция се дефинира като обикновена функция, която не е член на клас. Има два вида приятелски функции:

1. Независима приятелска функция: Тези функции се декларират във всеки от класовете като приятелски. Те не са член-функции на класа и затова те нямат достъп до елементите му. Поради тази причина е необходимо подаването на обект по явен начин като параметър на функцията (съответно извикването ще се извършва чрез името на функцията и списък от фактически параметри).

Пример: Дефинираме два класа представляващи марки автомобили с обща функция за определяне на по-бързият автомобил:

	#include "stdafx.h"
	#include "iostream.h"

	// Предварителна декларация
	class bmw;
	class porsche;

	class bmw{
	private:
		unsigned maxspeed;
	public:
		// Приятелска функция
		friend int cmpspeed(bmw *, porsche *);

		bmw(char *, unsigned speed);
		char *model;
	};

	bmw::bmw(char *c, unsigned speed){
		model = c;
		maxspeed = speed;
	}

	class porsche{
	private:
		unsigned maxspeed;
	public:
		friend int cmpspeed(bmw *, porsche*);
		porsche(char *, unsigned speed);
		char *model;
	};

	porsche::porsche(char *c, unsigned speed){
		model = c;
		maxspeed = speed;
	}

	// Дефиниция на приятелската функция
	int cmpspeed(bmw *a, porsche *b){
		// Тя има достъп от елементите maxspeed
		// въпреки че те са private!
		return (a->maxspeed - b->maxspeed);
	}

	void main(){
		bmw *x6 = new bmw("X6 xDrive 35i", 239);
		porsche *cayenne = new porsche("Cayenne S", 270);
		if (cmpspeed(x6, cayenne) < 0){
			cout << cayenne->model;
			cout << " is faster!" << endl;
		}
		else{
			if (cmpspeed(x6, cayenne) > 0){
				cout << x6->model;
				cout << " is faster!" << endl;
			}
			else{
				cout << x6->model;
				cout << " and ";
				cout << cayenne->model;
				cout << " are at equal speeds";
			}
		}
	}

2.  Член-функция на клас като приятелска за друг клас: При декларирането на приятелската функция трябва да се прецизира класът, на който тя е член-функция с помощта на оператор за принадлежност (::).

Пример: Отново условието от горният пример, но този път функцията cmpspeed е член-функция на класа bmw. Промените в кода са удебелени:

	#include "stdafx.h"
	#include "iostream.h"

	class porsche;

	class bmw{
	private:
		unsigned maxspeed;
	public:
		bmw(char *, unsigned speed);
		char *model;
		// За BMW вече cmpspeed е член-функция
		int cmpspeed(porsche *);
	};

	class porsche{
	private:
		unsigned maxspeed;
	public:
		// Извикваме функцията като приятелска
		friend int bmw::cmpspeed(porsche*);
		porsche(char *, unsigned speed);
		char *model;
	};

	bmw::bmw(char *c, unsigned speed){
		model = c;
		maxspeed = speed;
	}

	// Дефиниция на самата функция
	int bmw::cmpspeed(porsche *b){
		return (maxspeed - b->maxspeed);
	}

	porsche::porsche(char *c, unsigned speed){
		model = c;
		maxspeed = speed;
	}

	void main(){
		bmw *x6 = new bmw("X6 xDrive 35i", 239);
		porsche *cayenne = new porsche("Cayenne S", 270);
		if (x6->cmpspeed(cayenne) < 0){
			cout << cayenne->model;
			cout << " is faster!" << endl;
		}
		else{
			if (x6->cmpspeed(cayenne) > 0){
				cout << x6->model;
				cout << " is faster!" << endl;
			}
			else{
				cout << x6->model;
				cout << " and ";
				cout << cayenne->model;
				cout << " are at equal speeds";
			}
		}
	}


Задача: Дефинирайте класове успоредник, квадрат и правоъгълник и напишете член-функции за изчисляване на лицата и периметрите на фигурите. Напишете:
- Приятелска за трите класа функция, която отпечатва на екрана фигурата с най-голямо лице и самото лице.
- Член-функция на класа успоредник, която е приятелска за другите два класа и връща числата 0, 1 или 2 в зависимост от това коя от фигурите е с най-голям периметър.

 



Добави коментар

Адресът на електронната поща няма да се публикува


*