    class ВСlass;	// Дополнительное неполное объявление класса 

    class AClass { 
        friend class BClass;    // BClass имеет доступ к всем членам AClass 
        ... //  другие члены 
     }; 

    class BClass { 
       friend class AClass;    // AClass имеет доступ к всем членам BClass 
                                             // ... другие члены; 
     };

    Все функции-члены в каждом из классов теперь имеют доступ к закрытым н 
защищенным членам объекта другого класса. Если в первом классе имеется ссылка 
по имени на второй класс, например в параметре функции-члена, то может 
понадобиться предварительное неполное объявление класса, как это сделано в 
данном случае для BClass. Это позволит в AClass объявлять данные-члены и 
параметры функций-членов типа BClass несмотря на то, что полное объявление 
BClass следует позже. 

    Дружественные функции 
    
    Дружественные функции похожи (однако менее обременительны) на 
дружественные классы. Объявление функции другом класса открывает ей доступ к 
закрытым и защищенным членам объекта класса. Дружественные функции могут быть 
обычными функциями C++ или членами класса. 
    Обычно дружественная функция объявляется с параметрами-классами, с 
которыми она "водит" дружбу. Внутри дружественной функции операторы имеют 
доступ к обычно скрытым членам объекта класса, переданного аргументом функции. 
    В листинге 15.2 демонстрируется объявление и использование типичной 
дружественной двум классам функции. 
    В FRIENDFN объявляются два класса, One и Two. Неполное объявление класса в 
строке 3 позволяет ссылаться в One на Two. В строках 6 и 14 объявляется 
дружественная функция с именем Show(). Поскольку в каждом классе функция ShowO 
объявляется дружественной, операторам ShowO разрешается доступ к закрытым и 
защищенным членам классов One и Two. (Классы, приведенные здесь, не имеют 
закрытых секций, но даже если бы они их имели, дружественная функция все равно 
имела бы доступ к членам этих секций.) 

    Листинг 15.2.   FRIENDFN.CPP (использование дружественных функций) 

    1: #include <iostream.h> 
    2: 
    3: class Two;	// Неполное объявление класса 
    4: 
    5: class One { 
    6:     friend void Show(0ne &c1, Two &c2); 
    7: private: 
    8:    char *s1;	// Доступен классу One и функции Show() 
    9: public: 
    10:  One() { s1 =	"Testing "; } 
    11: }; 
    12: 
    13: class Two { 
    14:     friend void	Show(0ne &c1, Two &c2); 
    15: private: 
    16:     char *s2;	// Доступен классу Two и функции Show() 
    17: public: 
    18:    Two() { s2 =	"one, two, three"; } 
    19: }; 
    20: 
    21: main() 
    22: { 
    23:  One c1; 
    24:  Two c2; 
    25: 
    26:  Show(c1, c2)	; 
    27:  return 0; 
    28: } 
    29: 
    30: void Show(0ne &c1, Two &c2) 
    31: { 
    32:    cout « c1.s1 « c2.s2 « '\n'; 
    33: } 


    370     Часть III. Профаммирование на ANSI C++ 
