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

    Дружественные классы 

    В классе можно объявить другой класс дружественным. Один класс (в котором 
объявляется друг) дает другому классу (другу) возможность доступа ко всем 
закрытым и защищенным членам первого класса. Открытые члены всегда доступны, 
таким образом, не надо объявлять один класс другом другого, чтобы дать ему 
доступ к открытым членам последнего. 
    Обычно дружественные классы используются, когда двум классам, не связанным 
отношением родства, необходим доступ к закрытым или защищенным секциям 
классов. Предположим, вы объявили следующий класс: 

    class AClass { 
    private: 
       double value;         // Закрытый член класса 
    public: 
       AClass() { value = 3.14159; } 
    }; 

    Класс AClass содержит один закрытый член value типа double. Конструктор 
класса присваивает этому члену значение 3.14159. За исключением этого 
действия, в классе не предусмотрены даже средства просмотра значения value 
объекта класса. Закрытый член находится в полной безопасности, как медвежонок 
под защитой мамаши-медведицы. 
    Далее, предположим, что вы объявили еще один класс, содержащий членом 
объект класса AClass: 

    class BClass { 
    private: 
         AClass anObject;	// член объекта класса AClass public: 
          void ShowValue(void) 
          { cout « anObject.value;   }	// ??? }; 

    Член anObject типа AClass закрыт в классе BClass. Функция-член ShowValue()
пытается отобразить value из anObject. Однако объявление не скомпилируется, 
поскольку член value закрыт в классе AClass и только функции-члены AClass 
имеют к нему доступ. 
    Замена в классе AClass спецификатора доступа private на protected для 
члена value не решает проблему. Защищенный член доступен в классе, в котором 
он объявлен, и в любых производных из него классах. Несмотря на то что класс 
BClass обладает объектом типа AClass, два этих класса не связаны между собой 
отношением родства, и члены BClass не имеют доступа к закрытым и защищенным 
членам AClass. Конечно, вы можете сделать член value открытым в классе AClass, 
но это сделает value доступным и во всех операторах. 
    Лучшее решение — сделать класс BClass другом класса AClass. Объекты BClass 
будут иметь доступ к value и всем другим закрытым и защищенным членам, а 
операторы вне двух классов будут лишены возможности доступа к запрещенным 
частям класса. Для этого следует указать ключевое слово friend внутри класса, 
к которому необходимо получить доступ в другом классе. В данном примере класс 
Вclacc получит доступ к закрытому члену value внутри AClass. Таким образом, для 
того, чтобы класс BClass получил доступ к этим закрытым данным в классе 
AClass, следует первый класс объявить дружественным второму. Вот новое 
объявление класса AClass: 

    class AClass { 
        friend class BClass;     // Класс BClass - друг класса AClass 
   private: 
       double value;                // Доступен членам классов AClass и BClass!!! 
   public: 
       AClassO { value = 3.14159; } ;	
   }

    Единственное отличие от предыдущего объявления — строка friend class 
BClass, дающая указание компилятору предоставить классу BClass доступ к 
защищенным и закрытым членам класса AClass. Другие операторы в других классах 
и в основной программе, как и раньше, не имеют доступа к объявленным закрытыми 
и защищенными членам класса AClass. Только BClass может частным образом 
проникнуть в закрытую "комнату" AClass. Таким образом, вы можете объявить 
любое число классов друзьями. Единственное ограничение — ключевое слово friend 
должно быть внутри объявления класса. Полезно запомнить еще некоторые факты.
    •   В классе должны быть перечислены все его друзья. 
    •   Класс, в котором содержатся закрытые и защищенные данные и в котором 
другой класс объявлен другом, дает этому другу специальный доступ к обычно 
скрытым членам объявленного класса. Класс никогда не может объявить сам себя 
другом другого класса. 


    368 136 Часть III. Программирование на ANSI C++ 
