Программирование >>  Дополнительные возможности наследования 

1 ... 193 194 195 [ 196 ] 197 198 199 ... 265


100:

101:

102:

103:

104:

105:

106:

107:

108:

109:

110:

111:

112:

113:

114:

115:

116:

117:

118:

119:

120:

121:

122:

123:

124:

125:

126:

127:

128:

129:

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

int mainO

Array<int> theArray; Array<Animal> theZoo; Animal *pAnimal;

массив целых массив животных

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

for (int i = 0; i < theArray.GetSi2e(); i++) < .

theArray[i] = i*2;

pAnimal = new Animal(i*3);

theZoo[i] = рАШта!;

int y,

for (j = 0; j < theArray.GetSizeO; ]++) {

cout theZooC j ]:\ f; theZoo[j ]. DisplayO; cout endl;

cout Now use the friend function to ; cout find the members of Array<int> ; Intrude(theArray);

cout \ n\ nDone.\ n ; return 0;

theZoo[0]

theZoo[1]

theZoo[2]

theZoo[3]

theZoo[4]

theZoo[5]

theZoo[6]

theZoo[7]

theZoo[8]

theZoo[9]

Now use the friend

function to find the members of Array<int>

Intrude



i: 10

~ У i: 12

i: 14

i; 16

i: 18

Done.

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

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

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

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

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

ostreaffl& operator (ostreamS, Array<T>&);

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

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

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

Шти 19.4. Нспряьзрвапие оператора вырода

ftinclude <iostreaffl.h>

const int DefaultSize = 10;

class Animal {

public:

Animal(int); Animal(); AnimalO { }

int GetWeightO const { return itsWeight; } void DisplayO const { cout itsWeight; }



13; private:

14: int itsWeight;

15: } ;

17: Animal::Animal(int weight): 18: itsWeight(weight) 19: { } 20:

21: Animal::Animal(): 22: itsWeight(O) 23: { } 24:

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

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

27: {

28: public:

29: конструкторы

30: Array(int itsSize = DefaultSize);

31: Array(const Array &rhs);

32: ArrayO { delete [] pType; }

34: операторы

35: Arrays operator=(const Array&);

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

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

38: { return pType[offSet]; }

39: методы доступа

40: int GetSizeO const { return itsSize; }

42: friend ostream& operator (ostream&, Array<T>&);

44: private: 45: T pType;

46: int itsSize;

47: } ; 48:

49; template <class T>

50: ostream& operator (ostream& output, Array<T>& theArray) 51; {

52; for (int i = 0; KtheArray.GetSizeO; i++)

53; output [ i ] << theArray[i] endl; return output;

54; }

56: Ряд выполнений... 57;

58; выполнение конструктора

59; template <class Т>

60: Array<T>:;Array(int size);

61: itsSize(size)

62; {



1 ... 193 194 195 [ 196 ] 197 198 199 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика