Lect05
.pdf5. Друзьякласса. Наследование.
«Объектно-ориентированное программирование»
доцентПриваловМ.В.
Донецк,ДонНТУ,2011
Друзьякласса
Класс,функцияилиметод,имеющие доступкзакрытойчастидругого классаназываютсядругомклассаили
дружественнымклассом(функцией, методом).
Друзейобъявляютспомощью модификатораfriend
Друзья...Дазачемонинужны
классу?!
vector multiply(const matrix& m, const vector& v) {
vector r;
for (int i = 0; i<4; i++) { r.elem(i) = 0;
for (int j = 0; j<4; j++) r.elem(i) +=m.elem(i,j)
}
* v.elem(j);
return r;
}
Друзья...Дазачемонинужны классу?!
Реализацияправильная?Правильная.
НОМЕДЛЕННАЯ!
Арифметическихопераций:16сложений,16 умножений,20присваиваний.52операции.
Вызововметодов:4*(1+4*3)=52.
Методсложнееэлементарнойоперации!
Решениепроблемы:
дружественность.
Проблема:"излишняя"защитаатрибутов.
Очевидноерешение:сделатьвнутренние свойстваклассовpublic.
Новедь...Нарушатьинкапсуляциюплохо!
Можносделатьфункциюумноженияобщей дляобоихклассов. Средство- friend
Свойствадрузей
Друзьяимеютдоступковсейобласти видимостикласса
"Другмоегодруганемойдруг"
Друзьяненаследуются
Приобъявлениидрузейчастовозникают циклическиессылкиклассовдругнадруга. Такаяситуацияможетбытьрешенапутем использованияупреждающегоописания.
Дружественнаяфункция
class matrix;
class vector {
float v[4]; // ...
friend vector multiply(const matrix&, const vector&);
};
class matrix { vector v[4]; // ...
friend vector multiply(const matrix&, const vector&);
};
Дружественнаяфункция
vector multiply(const matrix& m, const vector& v) { vector r;
for (int i = 0; i<3; i++) {
r.v[i] = 0;
for ( int j = 0; j<3; j++) r.v[i] +=m.v[i][j] * v.v[j];
}
return r;
}
Другиеразновидностидрузей
class MyClass;
class MyClass2
{
public:
MyClass2(){}
void FriendMethod(MyClass classParam);
};
Другиеразновидностидрузей
class MyClass {
friend class MyFriend;
friend void MyClass2::FriendMethod(MyClass
classParam);
friend void FriendFunction(MyClass classParam);
public: MyClass() {} int x;
private: int y;
};