Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

1.5. Классы 43

1.5.4 Друзья класса и участники класса

Сложные структуры данных, как правило, включают взаимодействие многих различных классов.

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

Мы сказали, что к членам парламента, не занимающим официального поста класса можно только получить доступ из класса, но есть исключение к этому. Определенно, мы можем объявить функцию как друг, что означает, что эта функция может получить доступ к частным данным класса. Есть много причин определения друга функции. Каждый - тот синтаксис, который требования могут запретить нам определение членской функции. Например, считайте класс SomeClass. Предположим, что мы хотим определить перегруженного оператора продукции для этого класса, и этому оператору продукции нужен доступ к данным члена парламента, не занимающего официального поста. Чтобы обращаться с этим, класс объявляет, что оператор продукции - друг класса как показано ниже.

класс SomeClass

частный:

международная тайна; общественность:

//... //предоставляют <<доступ оператора к тайне

друг ostream& оператор <<(ostream&, константа SomeClass& x);

; ostream& оператор <<(ostream&, константа SomeClass& x)

суд <<x.secret;

Другое время, когда уместно использовать друзей, когда два различных класса

тесно связаны. Например, Кодовый Фрагмент 1,1 шоу два сотрудничающих Вектора классов и Матрица. Прежние магазины трехмерный вектор и последний

хранит 3 3 матрицы. В этом кодовом фрагменте мы показываем всего один пример

полноценность дружбы класса. Векторные магазины класса - координаты в частном

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

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

Обратите внимание на то, что «дружба» не переходная. Например, если бы новый Тензор класса был приобретен друг Матрицы, то Тензор не был бы другом Вектора, если Вектор класса не должен был явно объявлять, что он был так.

44

Вектор класса

общественность://... опущены общественные участники

частный:

двойной coord[3]; друг Матрица класса;

;

Матрица класса

общественность:

Вектор умножается (константа Vector& v);//... опущены другие общественные участники

частный:

удвойтесь [3] [3];

;

Глава 1. C ++ учебник для начинающих

//вектор с 3 элементами

//хранение для координат//предоставляет Матричный доступ к coord

//3x3 матрица

//умножьтесь вектором v

//матричные записи

Векторная Матрица:: умножьтесь (константа Vector& v)//умножаются вектором v

Вектор w;

для (интервал i = 0; я <3; я ++)

для (интервал j = 0; j <3; j ++)

w.coord [я] + = [я] [j] * v.coord [j]; //доступ к coord позволен

возвратите w;

Кодовый Фрагмент 1.1: пример дружбы класса.

Гнездящиеся классы и типы в пределах классов

Мы знаем, что классы могут определить членские переменные и членские функции. Классы

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

Книга класса

общественность:

Закладка класса

//... (Определение закладки здесь)

;

//... (Остаток от Книжного определения)

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