Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 19.7. Использование статических переменных-членов и функций-членов с шаблонам
1: #include < iostream.h> 2: 3: const int DefaultSize = 3; 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: // оператор вывода обьектов типа Anlmal 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) "; 37: } 38: 39: Animal:: Animal(): 40: itsWeight(0) 41: { 42: // cout < < " animal() "; 43: } 44: 45: Animal:: ~Animal() 46: { 47: // cout < < " Destroyed an animal..."; 48: } 49: 50: template < class T> // объявляем шаблон и параметр 51: class Array // параметризованный класс 52: { 53: public: 54: // конструкторы 55: Array(int itsSize = DefaultSize); 56: Array(const Array & rhs); 57: ~Array() { delete [] рТуре; itsNumberArrays-; } 58: 59: // операторы 60: Array& operator=(const Array&); 61: T& operator[](int offSet) { return pType[offSet]; } 62: const T& operator[](int offSet) const 63: { return pType[offSet]; } 64: // аксессоры 65: int GetSize() const { return itsSize; } 66: static int GetNumberArrays() { return itsNumberArrays; } 67: 68: // функция-друг 69: friend ostream& operator< < (ostream&, const Array< T> &); 70: 71: private: 72: T *pType; 73: int itsSize; 74: static int itsNumberArrays; 75: }; 76: 77: template < class T> 78: int Array< T>:: itsNumberArrays = 0; 79: 80: template < class T> 81: Array< T>:: Array(int size = DefaultSize): 82: itsSize(size) 83: { 84: pType = new T[size]; 85: for (int i = 0; i< size; i++) 86: pType[i] = (T)0; 87: itsNumberArrays++; 88: } 89: 90: template < class T> 91: Array< T> & Array< T>:: operator=(const Array & rhs) 92: { 93: if (this == & rhs) 94: return *this; 95: delete [] pType; 96: itsSize = rhs.GetSize(); 97: pType = new T[itsSize]; 98: for (int i = 0; i< itsSize; i++) 99: pType[i] = rhs[i]; 100: } 101: 102: template < class T> 103: Array< T>:: Array(const Array & rhs) 104: { 105: itsSize = rhs.GetSize(); 106: pType = new T[itsSize]; 107: for (int i = 0; i< itsSize; i++) 108: pType[i] = rhs[i]; 109: itsNumberArrays++; 110: } 111: 112: 113: template < class T> 114: ostream& operator< < (ostream& output, const Array< T> & theArray) 115: { 116: for (int i = 0: i< theArray.GetSize(); i++) 117: output'< < " [" < < i < < " ] " < < theArray[i] < < endl; 118: return output; 119: } 120: 121: 122: 123: int main() 124: { 125: 126: cout < < Array< int>:: GetNumberArrays() < < " integer arrays\n"; 127: cout < < Array< Animal>:: GetNumberArrays(); 128: cout < < " animal arrays\n\n"; 129: Array< int> intArray; 130: Array< Animal> animalArray; 131: 132: cout < < intArray.GetNumberArrays() < < " integer arrays\n"; 133: cout < < animalArray.GetNumberArrays(); 134: cout < < " animal arrays\n\n"; 135: 136: Array< int> *pIntArray = new Array< int>; 137: 138: cout < < Array< int>:: GetNumberArrays() < < " integer arrays\n"; 139: cout < < Array< Animal>:: GetNumberArrays(); 140: cout < < " animal arrays\n\n"; 141: 142: delete pIntArray; 143: 144: cout < < Array< int>:: GetNumberArrays() < < " integer arrays\n"; 145: cout < < Array< Animal>:: GetNumberArrays(); 146: cout < < " animal arrays\n\n"; 147: return 0; 148: }
Результат: 0 integer arrays 0 animal arrays 1 integer arrays 1 animal arrays 2 integer arrays 1 animal arrays 1 integer arrays 1 animal arrays
Анализ: Для экономии места в листинге опущено объявление класса Animal. В класс Array добавлена статическая переменная itsNumberArrays (в строке 74), а поскольку эта перемененная объявляется в разделе закрытых членов, в строке 66 добавлен открытый статический метод доступа GetNumberArrays(). Инициализация статической переменной-члена выполняется явно в строках 77 и 78. Конструкторы и деструктор класса Array изменены таким образом, чтобы могли отслеживать число массивов, существующих в любой момент времени. Доступ к статической переменной, заданной в шаблоне, можно получить так же, как и при работе со статическими переменными-членами обычного класса: с помощью метода доступа, вызванного для объекта класса, как показано в строках 132 и 133, или явным обращением к переменной класса, как показано в строках 126 и 127. Обратите внимание, что при обращении к статической переменной-члену необходимо указать тип массива, так как для каждого типа будет создана своя статическая переменная-член.
Рекомендуется: Используйте статические члены в шаблонах. Специализируйте выполнение шаблона путем замещения функций шаблона для разных типов. Указывайте параметр типа при вызове статических функций шаблона, чтобы получить доступ к функции требуемого типа.
|