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


ОГРАНИЧЕНИЕ КОЛИЧЕСТВА ДРУЗЕЙ



Как вы только что узнали, если вы объявляете один класс другом другого класса, вы обеспечиваете классу-другу доступ к частным элементам данных этого другого класса. Вы также знаете и то, что чем больше доступа к частным данным класса, тем больше шансов на внесение ошибок в программу. Следовательно, если доступ кчастным данным другого класса необходим только нескольким функциям класса, C++ позволяет указать, что только определенные функции дружественного класса будут иметь доступ к частным элементам. Предположим, например, что класс librarian, представленный в предыдущей программе, содержит много разных функций. Однако предположим, что только функциям change_catalog и get_catalog необходим доступ к частным элементам класса book. Внутри определения класса book мы можем ограничить доступ к частным элементам только этими двумя функциями, как показано ниже:

class book

{
public:
book(char *, char *, char *);
void show_book(void);
friend char *librarian:: get_catalog(book);
friend void librarian: : change_catalog( book *, char *);
private:
char title[64];
char author[ 64 ];
char catalog[64];
};

Как видите, операторы friend содержат полные прототипы всех дружественных функций, которые могут напрямую обращаться к частным элементам.

О функциях-друзьях

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

public:
friend class_name:: function_name(parameter types);

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

Если ваша программа начинает ссылаться на один класс из другого, вы можете получить синтаксические ошибки, если порядок определения классов неверен. В данном случае определение класса book использует прототипы функций, определенные в классе librarian. Следовательно, определение класса librarian должно предшествовать определению класса book. Однако если вы проанализируете класс librarian, то обнаружите, что он ссылается на класс book:

 

class librarian

{
public:
void change_catalog(book *, char *);
char *get_catalog(book);
};

Поскольку вы не можете поставить определение класса book перед определением класса librarian, C++ позволяет вам объявить класс book, тем самым сообщая компилятору, что такой класс есть, а позже определить его. Ниже показано, как это сделать:

class book; // объявление класса

Следующая программа LIMITFRI.CPP использует дружественные функции для ограничения доступа класса librarian к частным данным класса book. Обратите внимание на порядок определения классов:

 

#include < iostream.h>

#include < string.h>

class book;

class librarian

{
public:
void change_catalog(book *, char *);
char *get_catalog(book);
};

class book

{
public:
book(char *, char *, char *);
void show_book (void);
friend char *librarian:: get_catalog(book);
friend void librarian:: change_catalog( book *, char *);
private:
char title[64];
char author[64];
char catalog[64];
};

book:: book(char *title, char *author, char *catalog)

{
strcpy(book:: title, title);
strcpy(book:: author, author);
strcpy(book:: catalog, catalog);
}

void book:: show_book(void)

{
cout < < «Название: » < < title < < endl;
cout < < «Автор: » < < author < < endl;
cout < < «Каталог: » < < catalog < < endl;
}

void librarian:: change_catalog(book *this_book, char *new_catalog)

{
strcpy(this_book-> catalog, new_catalog);
}

char *librarian:: get_catalog(book this_book)

{
static char catalog[64];
strcpy(catalog, this_book.catalog);
return(catalog);
}

void main(void)

{
book programming( «Учимся программировать на C++», «Jamsa», «P101″ );
librarian library;
programming.show_book();
library.change_catalog(& programming, «Легкий C++ 101″ );
programming.show_book();
}

Как видите, программа сначала использует объявление, чтобы сообщить компилятору, что класс book будет определен позже. Поскольку объявление извещает компилятор о классе book, определение класса librarian может ссылаться на класс book, который еще не определен в программе.

Что такое идентификатор класса

Идентификатор представляет собой имя, например имя переменной или класса. Если ваши программы используют дружественные классы, то может случиться, что определение одного класса ссылается на другой класс (его имя или идентификатор), о котором компилятор C++ еще ничего не знает. В таких случаях компилятор C++ будет сообщать о синтаксических ошибках. Чтобы избавиться от ошибок типа «что следует определять сначала», C++ позволяет вам включать в начало исходного текста программы объявление класса, тем самым вводя идентификатор класса:

class class_name;

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

ЧТО ВАМ НЕОБХОДИМО ЗНАТЬ

В данном уроке вы изучили, как использовать классы-друзья для обращения к частным элементам другого класса напрямую с использованием оператора точки. В уроке 29 вы изучите, как использовать в C++ шаблоны функций для упрощения определения подобных функций. Но прежде чем перейти к уроку 29 убедитесь, что вы освоили следующее:

 

1. Использование в ваших программах на C++ друзей позволяет одному классу обращаться к частным элементам другого класса напрямую, используя оператор точку.

2. Для объявления одного класса другом (friend) другого класса вы должны внутри определения этого другого класса указать ключевое слово friend, за которым следует имя первого класса.

3. После объявления класса другом по отношению к другому классу, все функции-элементы класса-друга могут обращаться к частным элементам этого другого класса.

4. Чтобы ограничить количество дружественных методов, которые могут обращаться к частным данным класса, C++ позволяет указать дружественные функции. Для объявления функции-друга вы должны указать ключевое слово friend, за которым следует прототип функции, которой, собственно, и необходимо обращаться к частным элементам класса.

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

При создании функций иногда возникают ситуации, когда две функции выполняют одинаковую обработку, но работают с разными типами данных (например, одна использует параметры типа int, а другая типа float). Вы уже знаете из урока 13, что с помощью механизма перегрузки функций можно использовать одно и то же имя для функций, выполняющих разные действия и имеющих разные типы параметров. Однако, если функции возвращают значения разных типов, вам следует использовать для них уникальные имена (см. примечание к уроку 13). Предположим, например, что у вас есть функция с именем тах, которая возвращает максимальное из двух целых значений. Если позже вам потребуется подобная функция, которая возвращает максимальное из двух значений с плавающей точкой, вам следует определить другую функцию, например fmax. Из этого урока вы узнаете, как использовать шаблоны C++ для быстрого создания функций, возвращающих значения разных типов. К концу данного урока вы освоите следующие основные концепции:

  • Шаблон определяет набор операторов, с помощью которых ваши программы позже могут создать несколько функций.
  • Программы часто используют шаблоны функций для быстрого определения нескольких функций, которые с помощью одинаковых операторов работают с параметрами разных типов или имеют разные типы возвращаемых значений.
  • Шаблоны функций имеют специфичные имена, которые соответствуют имени функции, используемому вами в программе.
  • После того как ваша программа определила шаблон функции, она в дальнейшем может создать конкретную функцию, используя этот шаблон для задания прототипа, который включает имя данного шаблона, возвращаемое функцией значение и типы параметров.
  • В процессе компиляции компилятор C++ будет создавать в вашей программе функции с использованием типов, указанных в прототипах функций, которые ссылаются на имя шаблона.

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


Поделиться:



Популярное:

  1. В которой счастью Оливера и его друзей неожиданно угрожает опасность
  2. В таблице показана зависимость частоты генерированного переменного тока от количества магнитных полюсов и числа оборотов генератора
  3. В условиях покоя только часть крови циркулирует в сосудах, которая составляет от общего количества крови
  4. Взаимосвязь количества и качества
  5. Возрастные особенности количества и состава крови
  6. ВОСПОМИНАНИЯ УЧЕНИКОВ И ДРУЗЕЙ УИЛЬЯМА К. ДЖАДЖА
  7. Выбор и расчёт необходимого количества торгово-технологического оборудования для торговли чёрным чаем и его эксплуатация.
  8. Выбор количества и наименования компрессоров станций
  9. Выбор типа и расчёт необходимого количества цементировочного оборудования
  10. Задача 7. Определение количества воды, необходимой для поддержания пластового давления и приемистости нагнетательных скважин
  11. Измерение расхода и количества вещества
  12. Как Оливер проводил время в душеспасительном обществе своих почтенных друзей


Последнее изменение этой страницы: 2016-05-30; Просмотров: 641; Нарушение авторского права страницы


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