Чтение онлайн

на главную - закладки

Жанры

Освой самостоятельно С++ за 21 день.

Либерти Джесс

Шрифт:

99: theZoo[i] = *pAnimal;

100: delete pAnimal;

101: }

102: // выводим на печать содержимое массивов

103: for (int j = 0; j < theArray.GetSize; j++)

104: {

105: cout << "theArray[" << j << "]:\t";

106: cout << theArray[j] << "\t\t";

107: cout << "theZoo[" << j << "]:\t";

108: theZoo[j].Display;

109: cout << endl;

110: }

111:

112: return 0;

113: }

Результат:

theArray[0] 0 theZoo[0] 0

theArray[1] 2 theZoo[1] 3

theArray[2] 4 theZoo[2] - 6

theArray[3] 6 theZoo[3] 9

theArray[4] 8 theZoo[4] 12

theArray[5] 10 theZoo[5] 15

theArray[6] 12 theZoo[6] 18

theArray[7] 14 theZoo[7] 21

theArray[8] 16 theZoo[8] 24

theArray[9] 18 theZoo[9] 27

Анализ:

В строках 8-26 выполняется создание класса Animal, благодаря которому объекты определяемого пользователем типа можно будет добавлять в массив.

Содержимое строки 29 означает, что в следующих за ней строках объявляется шаблон, параметром для которого является тип, обозначенный идентификатором Т. Класс Array содержит два конструктора, причем первый конструктор принимает размер и по умолчанию устанавливает его равным значению целочисленной константы DefaultSize.

Затем объявляются операторы присваивания и индексирования, причем объявляются константная и не константная версии оператора индексирования. В качестве единственного метода доступа служит функция GetSize, которая возвращает размер массива.

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

Раздел закрытых данных содержит переменные-члены размера массива и указатель на массив объектов, реально помещенных в память.

Функции шаблона

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

void SomeFunction(Array<int>&); // правильно

А запись

void SomeFunction(Array<T>&); // ошибка!

неверна, поскольку отсюда не ясно, что представляет собой выражение T&. Запись

void SomeFunction(Array &); // ошибка!

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

Чтобы реализовать более общий подход использования объектов, созданных на основе шаблона, нужно объявить функцию шаблона:

template <class T>

void MyTemplateFunction(Array<T>&); //

верно

Здесь MyTemplateFunction объявлена как функция шаблона, на что указывает первая строка объявления. Заметьте, что функции шаблонов, подобно другим функциям, могут иметь любые имена.

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

template <class T>

void MyOtherFunction(Array<T>&, Array<int>&); // верно

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

Шаблоны и друзья

В шаблонах классов могут быть объявлены три типа друзей:

• дружественный класс или функция, не являющиеся шаблоном;

• дружественный шаблон класса или функция, входящая в шаблон;

• дружественный шаблон класса или шаблонная функция, специализированные по типу данных.

Дружественные классы и функции, не являющиеся шаблонами

Можно объявить любой класс или функцию, которые будут дружественны по отношению к вашему классу шаблона. В этом случае каждый экземпляр класса: будет обращаться с другом так, как будто объявление класса-друга было сделано в этом конкретном экземпляре. В листинге 19.3 в определении шаблона класса Array добавлена тривиальная дружественная функция Intrude, а в управляющей.программе делается вызов этой функции. В качестве друга функция Intrude получает доступ к закрытым данным класса Array. Но поскольку эта функция не является функцией шаблона, то ее можно вызывать только для массива заданного типа (в нашем примере для массива целых чисел).

Листинг 18.3. Функция-друг, не являющаяся шаблоном

1: // Листинг 19.3. Использование в шаблонах функций-друзей определенного типа

2:

3: #include <iostream.h>

4:

5: const int DefaultSize = 10;

6:

7: // обьявляем простой класс Animal, чтобы можно

8: // было создать массив животных

9:

10: class Animal

11: {

12: public:

13: Animal(int);

14: Animal;

15: ~Animal { }

16: int GetWeight const { return itsWeight; }

17: void Display const { cout << itsWeight; >

18: private:

19: int itsWeight;

20: };

21:

22: Animal::Animal(intweight):

23: itsWeight(weight)

24: { }

25:

26: Animal::Animal:

27: itsWeight(0)

28: { }

29:

30: template <class T> // обьявляем шаблон и параметр

31: class Array // параметризованный класс

32: {

Поделиться:
Популярные книги

Жатва душ. Несущий свет

Сугралинов Данияр
2. Жатва душ
Фантастика:
постапокалипсис
рпг
дорама
5.00
рейтинг книги
Жатва душ. Несущий свет

Измена. Право на счастье

Вирго Софи
1. Чем закончится измена
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на счастье

Антикиллер-2

Корецкий Данил Аркадьевич
2. Антикиллер
Детективы:
боевики
9.23
рейтинг книги
Антикиллер-2

Имя нам Легион. Том 5

Дорничев Дмитрий
5. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 5

Идеальный мир для Демонолога 4

Сапфир Олег
4. Демонолог
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Демонолога 4

Офицер империи

Земляной Андрей Борисович
2. Страж [Земляной]
Фантастика:
боевая фантастика
попаданцы
альтернативная история
6.50
рейтинг книги
Офицер империи

Вперед в прошлое 3

Ратманов Денис
3. Вперёд в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 3

Варрэн-Лин: Искра Стаи

Ариманта Юна
3. Варрэн-Лин
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Варрэн-Лин: Искра Стаи

Наследник

Шимохин Дмитрий
1. Старицкий
Приключения:
исторические приключения
5.00
рейтинг книги
Наследник

Неправильный солдат Забабашкин

Арх Максим
1. Неправильный солдат Забабашкин
Фантастика:
попаданцы
альтернативная история
5.62
рейтинг книги
Неправильный солдат Забабашкин

Мастер Разума IV

Кронос Александр
4. Мастер Разума
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер Разума IV

Золотой ворон

Сакавич Нора
5. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Золотой ворон

Барон переписывает правила

Ренгач Евгений
10. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Барон переписывает правила

Первый среди равных. Книга IX

Бор Жорж
9. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга IX