|
Программирование >> Дополнительные возможности наследования
А запись void SomeFunction(Array<T>&); ошибка! неверна, поскольку отсюда не ясно, что представляет собой выражение Т&. Запись void SomeFunction(Array &); ошибка! тоже ошибочна, так как объекта класса Array не сушествует - есть только шаблон и его экземпляры. Чтобы реализовать более обший подход использования объектов, созданных на основе шаблона, нужно объявить функцию шаблона: template <class Т> void !yTemplateFunction(Array<T>&); верно Здесь !yTemplateFunotion() объявлена как функция шаблона, на что указывает первая строка объявления. Заметьте, что функции шаблонов, подобно другим функциям, могут иметь любые имена. Функции шаблонов, помимо объектов, заданных в параметризованной форме, могут также принимать и экземпляры шаблона. Проиллюстрируем это на примере: template <class Т> void !yOtherFunction(Array<T>&, Array<int>&); верно Обратите внимание на то, что эта функция принимает два массива: параметризованный массив и массив целых чисел. Первый может быть массивом любых объектов, а второй - только массивом целых чисел. ШаОлоны U друзья в шаблонах классов могут быть объявлены три типа друзей: дружественный класс или функция, не являющиеся шаблоном; дружественный шаблон класса или функция, входящая в шаблон; дружественный шаблон класса или шаблонная функция, специализированные по типу данных. Дружвстввнныв классы и функции, нв являющиеся шаОлпнамн Можно объявить любой класс или функцию, которые будут дружественны по отношению к вашему классу шаблона. В этом случае каждый экземпляр класса будет обращаться с другом так, как будто объявление класса-друга было сделано в этом конкретном экземпляре. В листинге 19.3 в определении шаблона класса Array добавлена тривиальная дружественная функция IntrudeO, а в управляющей,программу делается вызов этой функции. В качестве друга функция Intruded) поручает доступ к закрытым данным класса Array. Но поскольку эта функция не является функцией шаблона, то ее можно вызывать только для массива заданного типа (в нашем примере для массива целых чисел). Aicmuia 18.3. Фуищия-друг, ie явяяищаяся шаОдавам 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 Листинг 19.3. Использование в шаблонах функций-друзей определенного типа Sinclude <iostream.h> const int DefaultSize = 10; обьявляем простой класс Animal, чтобы можно было создать массив животных class Animal { public: Animal(int); AnimalO; AnimalO { } int GetWeightO const { return itsWeight; } void DisplayO const { cout itsWeight; } private: int itsWeight; Animal::Animal(int weight): itsWeight(weight) Animal: :AnimalO: itsWeight(O) { > template <class T> обьявляем шаблон и параметр class Array параметризованный класс public: конструкторы Array(int itsSize = DefaultSize); Array(const Array &rhs); ArrayO { delete [] pType; } операторы Array& operator=(const Array&); T& operator[](int offSet) { return pType[offSet]; } const T& operator[](int offSet) const { return pType[offSet]; } методы доступа int GetSizeO const { return itsSize; } функция-друг friend void Intrude(Array<int>); 49 50 51 52 53 54 55 56 57 .58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 private: Т *рТуре; int itsSize; > ; Поскольку функция-друг не является шаблоном, ее можно использовать только с массивами целых чисел! Но она получает доступ к закрытым данным класса. void Intrude(Arrav<int> theArray) cout << Л n** Intrude ♦**\ n ; for (int i = 0; i < theArray.itsSize; i++) cout i: theArray.pType[i] endl; cout \ n ; Ряд выполнений... выполнение конструктора template <class Т> Array<T>::Array(int size): itsSize(size) < pType = new T[size]; for (int i = 0; Ksize; i++) pType[i] = 0; конструктор-копировщик template <class T> Array<T>::Array(const Array &rhs) < itsSize = rhs.GetSizeO; pType = new T[itsSize]; for (int i = 0; KitsSize; i++) pType[i] = rhs[i]; перегрузка оператора присваивания (=) template <class T> Array<T>& Array<T>:;operator=(oonst Array &rhs) { if (this == &rhs) return ♦this; delete [] pType; itsSize = rhs.GetSizeO; pType = new T[itsSize]; for (int i = 0; KitsSize; i++) pType[i] = rhs[i]; return ♦this;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |