Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Дружественный класс или функция как Общий шаблонСодержание книги
Поиск на нашем сайте
В класс Array было бы весьма полезно добавить оператор вывода данных. Это можно сделать путем объявления оператора вывода для каждого возможного типа массива, но такой подход свел бы не нет саму идею использования класса Array как шаблона. Поэтому нужно найти другое решение. Попробуем добиться того, чтобы оператор вывода работал независимо от типа экземпляра массива. ostream& operator<< (ostream&, Array<T>&); Чтобы этот оператор работал, нужно так объявить operator<<, чтобы он стал функцией шаблона: template <class T> ostream& operator<< (ostream&, Array<T>&) Теперь operator<< является функцией шаблона и его можно использовать в выполнении класса. В листинге 19.4 показано объявление шаблона Array, дополненное объявлением функции оператора вывода operator<<. Листинг 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<<() определена для каждого типа объекта, сохраняемого в массиве.
|
||||
Последнее изменение этой страницы: 2016-12-10; просмотров: 306; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.28.217 (0.009 с.) |