Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 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.
|