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

на главную

Жанры

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

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

Шрифт:

33: public:

34: // конструкторы

35: Array(int itsSize = DefaultSize);

36: Array(const Array &rhs);

37: ~Array { delete [] pType; }

38:

39: // операторы

40: Array& operator=(const Array&);

41; T& operator[](int offSet) { return pType[offSet]; }

42: const T& operator[](int offSet) const

43: { return pType[offSet]; }

44: // методы доступа

45: int GetSize const { return itsSize; }

46:

47: //

функция-друг

48: friend void Intrude(Array<int>);

49

50: private:

51: T *рТуре;

52: int itsSize;

53: };

54:

55: // Поскольку функция-друг не является шаблоном, ее можно использовать только

56: // с массивами целых чисел! Но она получает доступ к закрытым данным класса.

57: void Intrude(Array<int> theArray)

58: {

59: cout << "\n*** Intrude ***\n";

60: for (int i = 0; i < theArray.itsSize; i++)

61: cout << "i: " << theArray.pType[i] << endl;

62: cout << "\n"

63: }

64:

65: // Ряд выполнений...

66:

67: // выполнение конструктора

68: template <class T>

69: Array<T>::Array(int size):

70: itsSize(size)

71: {

72: pType = new T[size];

73: for (int i = 0; i<size; i++)

74: pType[i] = 0;

75: }

76:

77: // конструктор-копировщик

78: template <class T>

79: Array<T>::Array(const Array &rhs)

80: {

81: itsSize = rhs.GetSize;

82: pType = new T[itsSize];

83: for (int i = 0; i<itsSize; i++)

84: pType[i] = rhs[i];

85: }

86:

87: // перегрузка оператора присваивания (=)

88: template <class T>

89: Array<T>& Array<T>::operator=(const Array &rhs)

90: {

91: if (this == &rhs)

92: return *this;

93: delete [] pType;

94: itsSize = rhs.GetSize;

95: pType = new T[itsSize];

96: for (int i = 0; i<itsSize; i++)

97: pType[i] = rhs[i];

98: return *this;

99: }

100:

101: // управляющая программа

102: int main

103: {

104: Array<int> theArray; // массив целых

105: Array<Animal> theZoo; // массив животных

106: Animal *pAnimal;

107:

108: // заполняем массивы

109: for (int i = 0; i < theArray.GetSize; i++)

110: {

111: theArray[i] = i*2;

112: pAnimal = new Animal(i*3);

113: theZoo[i] = *pAnimal;

114: }

115:

116: int j;

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

118: {

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

120: theZoo[j].Display;

121: cout << endl;

122: }

123: cout << "Now use the friend function to";

124: cout << "find the members of Array<int>";

125: Intrude(theArray);

126:

127: cout << "\n\nDone.\n";

128: return 0;

129: }

Результат:

theZoo[0]: 0

theZoo[1]: 3

theZoo[2]: 6

theZoo[3]: 9

theZoo[4]: 12

theZoo[5]: 15

theZoo[6]: 18

theZoo[7]: 21

theZoo[8]: 24

theZoo[9]: 27

Now use the friend function to find the members of Array<int>

*** Intrude ***

i: 0

i: 2

i: 4

i: 6

i: 8

i: 10

i: 12

i: 14

i: 16

i: 18

Done.

Анализ: Объявление шаблона Array было расширено за счет включения дружественной функции Intrude. Это объявление означает, что каждый экземпляр массива типа int будет считать функцию Intrude дружественной, а следовательно, она будет иметь доступ к закрытым переменным-членам и функциям-членам экземпляра этого массива.

В строке 60 функция lntrude непосредственно обращается к члену itsSize, а в строке 61 получает прямой доступ к переменной-члену pType. В данном случае без использования функции-друга можно было бы обойтись, поскольку класс Array предоставляет открытые методы доступа к этим данным. Этот листинг служит лишь примером того, как можно объявлять и использовать функции-друзья шаблонов.

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

В класс Array было бы весьма полезно добавить оператор вывода данных. Это можно сделать путем объявления оператора вывода для каждого возможного типа массива, но такой подход свел бы не нет саму идею использования класса Array как шаблона.

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

ostream& operator<< (ostream&, Array<T>&);

Чтобы этот оператор работал, нужно так объявить operator<<, чтобы он стал функцией шаблона:

template <class T> ostream& operator<< (ostream&, Array<T>&)

Теперь operator<< является функцией шаблона и его можно использовать в выполнении класса. В листинге 19.4 показано объявление шаблона Array, дополненное объявлением функции оператора вывода operator<<.

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

Сумеречный Стрелок 2

Карелин Сергей Витальевич
2. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 2

Не грози Дубровскому! Том Х

Панарин Антон
10. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том Х

Измена. Верну тебя, жена

Дали Мила
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Верну тебя, жена

Волк 2: Лихие 90-е

Киров Никита
2. Волков
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Волк 2: Лихие 90-е

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

Законы Рода. Том 4

Flow Ascold
4. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 4

Ученик. Книга третья

Первухин Андрей Евгеньевич
3. Ученик
Фантастика:
фэнтези
7.64
рейтинг книги
Ученик. Книга третья

Менталист. Эмансипация

Еслер Андрей
1. Выиграть у времени
Фантастика:
альтернативная история
7.52
рейтинг книги
Менталист. Эмансипация

Не грози Дубровскому! Том VIII

Панарин Антон
8. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том VIII

Столичный доктор. Том III

Вязовский Алексей
3. Столичный доктор
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Столичный доктор. Том III

Тринадцатый IV

NikL
4. Видящий смерть
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Тринадцатый IV

Возвышение Меркурия. Книга 3

Кронос Александр
3. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 3

Поход

Валериев Игорь
4. Ермак
Фантастика:
боевая фантастика
альтернативная история
6.25
рейтинг книги
Поход

Темный Патриарх Светлого Рода 4

Лисицин Евгений
4. Темный Патриарх Светлого Рода
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 4