Пријатели на класа
Пријателски функции Пријателските
функциите се функции кои не се членови на класа, но имаат пристап до приватни
членови на класата. Овие функции можат да бидат глобални функции или членови на
други класи.
Глобалните
функции кои претставуваат услуги од класа или операции на таа класа (обично
пријатели од таа класа) се нарекуваат класни услуги. „Пријателство“
не е наследено: ако функцијата f е пријател на класа X, а класата Y е изведена (наследник)
од класа X, функцијата f не е пријател на класа Y. #include <iostream> using namespace std;
class Rastojanie { private: int metri; friend int Dodadi5(Rastojanie); // friend funkcija public: Rastojanie() // konstruktor { metri=0; } };
int Dodadi5(Rastojanie d) // friend funkcija definicija { d.metri += 5; //pristap do privaten clen so friend funkcija return d.metri; }
int main() { Rastojanie D; cout << "Rastojanie: " << Dodadi5(D); return 0; }
Пријателски
класи Ако од сите функции на член на класа Y се бара да бидат пријателски функции на класа X, тогаш класата Y е декларирана како пријателска класа на класа X. Тогаш сите функции на член на класа Y можат да пристапат до приватни членови од класа X, обратно не важи („пријателството“ не е симетрична врска): class X {
friend class
Y;
//
prijatelska klasa na X }; class Y { ............ }; „Пријателство“ не е ниту преодна врска: ако класата Y е пријател на класа X, а класата Z е пријател на класа Y, класата Z не е автоматски пријател на класа X, но таа мора да биде експлицитно нагласена (доколку е потребно ) Пријателски класи обично се користат кога некои две класи имаат поблиски меѓусебни односи. Во исто време, непотребно е (и лошо) да се „откријат“ делови од класата, така што тие ќе бидат достапни на друга пријателска класа, бидејќи на тој начин ќе бидат достапни и за другите (се распаѓа енкапсулацијата - затвореноста на податоците). Тогаш овие две класи се прогласени за пријателски. Пример: За собирање на два броја членови на две класи од која klasaB е пријателска класа на klasaA #include <iostream> using namespace std; class KlasaB; class KlasaA { private: int brojA; friend class KlasaB; public: KlasaA() {brojA=12;} }; class KlasaB { private: int brojB; public: KlasaB() {brojB=1;} int soberi() { KlasaA objektA; return objektA.brojA + brojB; } }; int main() { KlasaB objektB; cout << "Suma: " << objektB.soberi(); return 0; }
|