Дружественные классы в C++ означают, что все методы одного класса, который объявлен другом, автоматически становятся дружественными методам другого класса, который инициирует дружбу. Это означает, что такие методы получают доступ ко всем членам другого класса. Объявлять классы дружественными нужно лишь в том случае, если всем методам необходимо иметь доступ к методам другого класса. В ином случае лучше объявить отдельные функции дружественными для большей защиты и сохранности и данных от случайных изменений. Рассмотрим пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#include <string.h> //strcpy class move; class child { char name[16]; int age; public: child (char*, int); friend int sameage(child &a, child &b); friend move; }; child::child(char *n, int c) { strcpy(name, n); age = c; } class move { public: void grow(child &, int ); }; void move::grow(child &obj, int num) { obj.age = obj.age+num; }; int sameage(child &a, child &b) { if(a.age==b.age) return 1; return 0; }; int main() { child e( "Egor", 3); child m( "Masha", 5); move curr; curr.grow(e,2); curr.grow(m,1); sameage(e,m); }; |
Сначала объявляется класс move для компилятора, иначе программа выдавала бы ошибку. После этого в классе child объявляем move другом. Сам класс child хранит имя и возраст. После этого работаем с классом move, добавляя ему метод grow. Все, простейшая дружественная связь создана. Теперь при вызове метода grow класса move можно работать с age и name – переменными класса child. Так же в примере отдельно объявлена дружественная функция sameage, которая использует его частную переменную age.