Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 18.4. Использование оператора вывода
1: #include < iostream.h> 2: 3: const int DefaultSize = 10; 4: 5: class Animal 6: { 7: public: 8: Animal(int); 9: Animal(); 10: ~Animal() { } 11: int GetWeight() const { return itsWeight; } 12: void Display() const { cout < < itsWeight; } 13: private: 14: int itsWeight; 15: }; 16: 17: Animal:: Animal(int weight): 18: itsWeight(weight) 19: { } 20: 21: Animal:: Animal(): 22: itsWeight(0) 23: { } 24: 25: template < class T> // объявляем шаблон и параметр 26: class Array // параметризованный класс 27: { 28: public: 29: // конструкторы 30: Array(int itsSize = DefaultSize); 31: Array(const Array & rhs); 32: ~Array() { delete [] pType; } 33: 34: // операторы 35: Array& 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 GetSize() const { return itsSize; } 41: 42: friend ostream& operator< < (ostream&, Array< T> &); 43: 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; i< theArray.GetSize(); i++) 53: output < < " [" < < i < < " ] " < < theArray[i] < < endl; return output; 54: } 55: 56: // Ряд выполнений... 57: 58: // выполнение конструктора 59: template < class T> 60: Array< T>:: Array(int size): 61: itsSize(size) 62: { 63: pType = new T[size]; 64: for (int i = 0; i< size; i++) 65: pType[i] = 0; 66: } 67: 68: // конструктор-копировщик 69: template < class T> 70: Array< T>:: Array(const Array & rhs) 71: { 72: itsSize = rhs.GetSize(); 73: pType = new T[itsSize]; 74: for (int i = 0; i< itsSize; i++) 75: pType[i] = rhs[i]; 76: } 77: 78: // перегрузка оператора присваивания (=) 79: template < class T> 80: Array< T> & Array< T>:: operator=(const Array & rhs) 81: { 82: if (this == & rhs) 83: return *this; 84: delete [] pType; 85: itsSize = rhs.GetSize(); 86: pType = new T[itsSize]; 87: for (int i = 0; i< itsSize; i++) 88: pType[i] = rhs[i]; 89: return *this; 90: } 91: 92: int main() 93: { 94: bool Stop = false; // признак для цикла 95: int offset, value; 96: Array< int> theArray; 97: 98: while (! Stop) 99: { 100: cout < < " Enter an offset (0-9) "; 101: cout < < " and a value. (-1 to stop): "; 102: cin > > offset > > value; 103: 104: if (offset < 0) 105: break; 106: 107: if (offset > 9) 108: { 109: cout < < " ***Please use values between 0 and 9.***\n"; 110: continue; 111: } 112: 113: theArray[offset] = value; 114: } 115: 116: cout < < " \nHere's the entire array: \n"; 117: cout < < theArray < < endl; 118: return 0; 119: }
Результат: 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) 1С 10 ***Please use values between 0 and 9.* > > * Enter an offset (0 -9) and а value. (-1 to stop) -1 -1 Here's the entire array: [0] 0 [1] 10 [2] 20 [3] 30 [4] 40 [5] 50 [6] 60 [7] 70 [8] 80 [9] 90
Анализ: В строке 42 объявляется шаблон функции operator< < () в качестве друга шаблона класса Array. Поскольку operator< < () реализован в виде функции шаблона, то каждый экземпляр этого типа параметризованного массива будет автоматически иметь функцию operator< < () для вывода данных соответствующего типа. Выполнение этого оператора начинается в строке 49. Каждый член массива вызывается по очереди. Этот метод работает только в том случае, если функция operator< < () определена для каждого типа объекта, сохраняемого в массиве.
|