Выбрать главу

    void initialize( Student *pS )

    {

        pS -> gpa =0 ; /* Теперь эти строки законны */

        pS -> semesterHours = 0 ;

    }

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

    class Student ;

    class Teacher

    {

        friend void registration( Teacher& , Student& ) ;

      public :

        void assignGrades( ) ;

      protected :

        int noStudents ;

        Student *pList[ 100 ] ;

    } ;

    class Student

    {

        friend void registration( Teacher& , Student& ) ;

      public :

        /* Те же открытые члены, что и раньше */

      protected :

        Teacher *рТ ;

        int semesterHours ; /* Количество часов в семестре */

        float gpa ;

    } ;

    void registration( Teacher& , Student& )

    {

        /* Инициализация объекта Student */

        s.semesterHours = 0 ;

        s.gpa = 0 ;

        /* Если есть место... */

        if ( t.noStudents < 100 )

        {

            /* Добавляем в конец списка */

            t.pList[ t.noStudents ] = &s ;

            t.noStudents++ ;

        }

    }

_________________

185 стр. Глава 15. Защищённые члены класса: не беспокоить!

В данном примере функция registration( ) может обращаться к обоим классам — и Student и Teacher, связывая их на этапе регистрации, но при этом не входя в состав этих классов.

«Обратите внимание, что в первой строке примера объявляется класс Student, но не объявляются его члены. Запомните: такое описание класса называется предварительным и в нём описывается только имя класса. Предварительное описание нужно для того, чтобы другие классы, такие, например, как Teacher, могли обращаться к классу Student. Предварительные описания используются тогда, когда два класса должны обращаться один к другому.»

[Помни!]

Функция-член одного класса может быть объявлена как друг некоторого другого класса следующим образом:

    class Teacher

    {

    /* Те же члены, что и раньше */

      public :

        void assignGrades( ) ;

    } ;

    class Student

    {

        friend void Teacher::assignGrades( ) ;

      public :

        /* Те же открытые члены, что и раньше */

      protected :

        /* Количество часов в семестре */

        int semesterHours ;

        float gpa ;

    } ;

    void Teacher::assignGrades( ) ;

    {

        /* Эта функция имеет доступ к  защищённым членам класса Student */

    }

В отличие от примера с функциями — не членами, функция-член класса должна быть объявлена перед тем, как класс Student объявит её другом.

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

_________________

186 стр. Часть 3. Введение в классы

    class Student ;

    class Teacher

    {

    protected :

        int noStudents ;

        Student *pList [ 100 ] ;

    public :

        void assignGrades( ) ;

    } ;