Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Защита внутреннего устройства класса



Ключевое слово protecte d позволяет исключить возможность установки gpa рав- ным не допустимому для этой величины значению. Внешнее приложение сможет до- бавить курс, но не сможет изменить значение среднего балла непосредственно. Если имеется необходимость непосредственного изменения значения gpa, класс может предоставить открытую функцию, предназначенную для этой цели, например:

class Student

{

 

// grade — делает то же, что и раньше

 

{

return gpa;

}

//даем возможность изменения средней оценки float

{

float     gpa;

//Проверяем допустимость значения if (newGPA > 0 newGPA <= 5.0)

{

gpa newGPA;

}

return oldGPA;

Глава 16. Защищенные члены класса: не беспокоить!          173


все остальное остается без изменений protected:

//количество прослушанных часов

float gpa;

};

Добавление новой функции grade (float ) позволяет внешним приложениям из- менять содержимое       Заметьте, что класс все равно не позволяет внешним функ- циям полностью контролировать содержимое своих защищенных членов. Внешнее приложение не может присвоить gpa любое значение, а только то, которое лежит в диапазоне между 0 и 5.0.

Теперь класс                  обеспечивает внешний доступ к своим внутренним членам, одновременно не позволяя присвоить им недопустимое значение.

Классы с ограниченным интерфейсом

Теперь наш класс предоставляет ограниченный интерфейс. Чтобы использовать класс, достаточно знать, каковы его открытые члены, что они делают и какие аргу- менты принимают. Это значительно уменьшает количество информации, которую не- обходимо помнить для работы с классом.

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

 

защищенным

Может случиться так, что потребуется предоставить некоторым внешним функци- ям возможность обращения к защищенным членам класса. Для такого доступа можно воспользоваться ключевым словом (друг).

 

"Друг всегда уступить готов место в шлюпке и круг.,."

Иногда внешним функциям требуется прямой доступ к данным-членам. Без неко- торого механизма "дружественности" программист был бы вынужден объявлять такие члены открытыми для всех, а значит, обращаться к этим членам могла бы любая внешняя функция.

Это похоже на то, как вы               оставляете соседям ключ от своего дома на время отпуска, чтобы они иногда проверяли его. Давать ключи не членам семьи не совсем хорошо, однако это куда лучше, чем оставлять дом открытым.

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

получает доступ ко всем членам класса Student.

class Student;

{

friend void

 

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

int            //количество часов в семестре float

 

 

774                              Часть III. "Классическое" программирование


//эта функция — друг класса Student

//и имеет доступ к его защищенным членам void *pS)

f

//теперь эти строки законны

= 0;

}

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

class Student; class Teacher i

friend void protected:

int Student

 

void

 

class

{

friend void         ' public:

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

 

Teacher

int           //количество часов в семестре float gpa;

};

В данном примере функция registratio n О может обращаться к обоим клас-

сам — и studen t и Teacher, связывая их на этапе регистрации, но при этом не входя в состав этих классов.

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

class Teacher

{

//те же члены, что и раньше public:

void

 

class Student

{

friend void public:

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

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

Глава 16. Защищенные члены класса: не беспокоить!           175


};

void

{

 

 

}


float gpa;

 

//эта функция имеет доступ к

//защищенным членам класса Student


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

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

class Student; class Teacher

{

protected:

int noStudents;

Student public:

void

};

class Student

{

friend class Teacher; public: • - - •

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

Teacher *pT;

int           //количество часов в семестре float gpa;

 

Теперь любая функция-член класса Teacher имеет доступ ко всем защищенным членам класса Объявление одного класса другом другого неразрывно связы- вает два класса.

 

176                           Часть ///. "Классическое" программирование


Глава


Поделиться:



Последнее изменение этой страницы: 2019-04-19; Просмотров: 182; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.023 с.)
Главная | Случайная страница | Обратная связь