Студопедия

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

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

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






Листинг 19.5. Передача в функцию экземпляра шаблона






1: #include < iostream.h>

2:

3: const int DefaultSize = 10;

4:

5: // Обычный класс, из объектов которого будет состоять массив

6: class Animal

7: {

8: public:

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

10: Animal(int);

11: Animal();

12: ~Animal();

13:

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

15: int GetWeight() const { return itsWeight; }

16: void SetWeight(int theWeight) { itsWeight = theWeight; }

17:

18: // дружественные операторы

19: friend ostream& operator< < (ostream&, const Animal&);

20:

21: private:

22: int itsWeight;

23: };

24:

25: // оператор вывода объектов типа Animal

26: ostream& operator< <

27: (ostream& theStream, const Animal& theAnimal)

28: {

29: theStream < < theAnimal.GetWeight();

30: return theStream;

31: }

32:

33: Animal:: Animal(int weight):

34: itsWeight(weight)

35: {

36: // cout < < " Animal(int)\n";

37: }

38:

39: Animal:: Animal():

40: itsWeight(0)

41: {

42: // cout < < " Animal()\n";

43: }

44:

45: Animal:: ~Animal()

46: {

47: // cout < < " Destroyed an animal...\n";

48: }

49:

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

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

52: {

53: public:

54: Array(int itsSlze = DefaultSize);

55: Array(const Array & rhs);

56: ~Array() { delete [] pType; }

57:

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

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

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

61: { return pType[offSet]; }

62: int GetSize() const { return itsSize; }

63:

64: // функция-друг

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

66:

67: private:

68: T *рТуре;

69: int itsSize;

70: };

71:

70: template < class T>

72: ostream& operator< < (ostream& output, const Array< T> & theArray)

73: {

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

75: output < < " [" < < i < < " ] " < < theArray[i] < < endl;

76: return output;

77: }

78:

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

80:

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

82: template < class T>

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

84: itsSize(size)

85: {

86: рТуре = new T[size];

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

88: pType[i] = 0;

89: }

90:

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

92: template < class T>

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

94: {

95: itsSize = rhs.GetSize();

96: рТуре = new T[itsSize];

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

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

99: }

100:

101: void IntFillFunction(Array< int> & theArray);

102: void AnimalFillFunction(Array< Animal> & theArray);

103:

104: int main()

105: {

106: Array< int> intArray;

107: Array< Animal> animalArray;

108: IntFillFunction(intArray);

109: AnimalFillFunction(animalArray);

110: cout < < " intArray...\n" < < intArray;

111: cout < < " \nanimalArray...\n" < < aninalArray < < endl;

112: return 0;

113: }

114:

115: void IntFillFunction(Array< int> & theArray)

116: {

117: bool Stop = false;

118: int offset, value;

119: while (! Stop)

120: {

121: cout < < " Enter an offset (0-9) ";

122: cout < < " and a value, (-1 to stop): ";

123: cin > > offset > > value;

124: if (offset < 0)

125: break;

126: if (offset > 9)

127: {

128: cout < < " ***Please use values between 0 and 9.***\n";

129: continue;

130: }

131: theArray[offset] = value;

132: }

133: }

134:

135:

136: void AnimalFillFunction(Array< Animal> & theArray)

137: {

138: Animal * pAnimal;

139: for (int i = 0; i< theArray, GetSize(); i++)

140: {

141: pAnimal = new Animal;

142: pAnimal-> SetWeight(i*100);

143: theArray[i] = *pAnimal;

144: delete pAnimal; // копия была помещена в массив

145: }

146: }

 

Результат:

Enter an offset (0- 9) and а value. (-1 to stop) 1 10

Enter an offset (0- 9) and а value. (-1 to stop) 2 20

Enter an offset (0- 9) and а value. (-1 to stop) 3 30

Enter an offset (0- 9) and а value. (-1 to stop) 4 40

Enter an offset (0- 9) and а value. (-1 to stop) 5 50

Enter an offset (0- 9) and а value. (-1 to stop) 6 60

Enter an offset (0- 9) and а value. (-1 to stop) 7 70

Enter an offset (0- 9) and а value. (-1 to stop) 8 80

Enter an offset (0- 9) and а value. (-1 to stop) 9 90

Enter an offset (0-9) and а value. (-1 to stop) 10 10

***Please use values between 0 and 9.***

Enter an offset (0-9) and a value. (-1 to stop): -1 -1

intArray:... [0] 0 [1] 10 [2] 20

[3] 30

[4] 40

[5] 50

[6] 60

[7] 70

[8] 80

[9] 90

animalArray:...

[0] 0

[1] 100

[2] 200

[3] 300

[4] 400

[5] 500

[6] 600

[7] 700

[8] 800

[9] 900

 

Анализ: В целях экономии места большая часть выполнения класса Array не показана в этом листинге. Класс Animal объявляется в строках 6—23. И хотя структура этого класса предельно упрощена, тем не менее в нем содержится собственный оператор вывода (< <), позволяющий выводить на экран объекты массива типа Animal.

Обратите внимание, что в классе Animal объявлен конструктор по умолчанию (конструктор без параметров, который еще называют стандартный). Без этого объявления нельзя обойтись, поскольку при добавлении объекта в массив используется конструктор по умолчанию данного объекта. При этом возникают определенные трудности, о которых речь пойдет ниже.

В строке 101 объявляется функция IntFillFunction(), параметром которой является целочисленный массив. Обратите внимание, что эта функция не принадлежит шаблону, поэтому может принять только массив целочисленных значений. Аналогичным

образом в строке 102 объявляется функция AnimalFillFunction(), которая принимает массив объектов типа Animal.

Эти функции выполняются по-разному, поскольку заполнение массива целых чисел отличается от заполнения массива объектов Animal.






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