Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг 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: {

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>);

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 предоставляет открытые методы доступа к этим данным. Этот листинг служит лишь примером того, как можно объявлять и использовать функции-друзья шаблонов.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.