Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Листинг 18.3. Функция-друг, не являющаяся шаблоном






    1: // Листинг 19.3. Использование в шаблонах функций-друзей определенного типа

    2:

    3: #include < iostream.h>

    4:

    5: const int DefaultSize = 10;

    6:

    7: // обьявляем простой класс Animal, чтобы можно

    8: // было создать массив животных

    9:

    10: class Animal

    11: {

    12: public:

    13: Animal(int);

    14: Animal();

    15: ~Animal() { }

    16: int GetWeight() const { return itsWeight; }

    17: void Display() const { cout < < itsWeight; >

    18: private:

    19: int itsWeight;

    20: };

    21:

    22: Animal:: Animal(intweight):

    23: itsWeight(weight)

    24: { }

    25:

    26: Animal:: Animal():

    27: itsWeight(0)

    28: { }

    29:

    30: template < class T> // обьявляем шаблон и параметр

    31: class Array // параметризованный класс

    32: {

    33: public:

    34: // конструкторы

    35: Array(int itsSize = DefaultSize);

    36: Array(const Array & rhs);

    37: ~Array() { delete [] pType; }

    38:

    39: // операторы

    40: Array& operator=(const Array&);

    41; T& operator[](int offSet) { return pType[offSet]; }

    42: const T& operator[](int offSet) const

    43: { return pType[offSet]; }

    44: // методы доступа

    45: int GetSize() const { return itsSize; }

    46:

    47: // функция-друг

    48: friend void Intrude(Array< int>);

    50: private:

    51: T *рТуре;

    52: int itsSize;

    53: };

    54:

    55: // Поскольку функция-друг не является шаблоном, ее можно использовать только

    56: // с массивами целых чисел! Но она получает доступ к закрытым данным класса.

    57: void Intrude(Array< int> theArray)

    58: {

    59: cout < < " \n*** Intrude ***\n";

    60: for (int i = 0; i < theArray.itsSize; i++)

    61: cout < < " i: " < < theArray.pType[i] < < endl;

    62: cout < < " \n"

    63: }

    64:

    65: // Ряд выполнений...

    66:

    67: // выполнение конструктора

    68: template < class T>

    69: Array< T>:: Array(int size):

    70: itsSize(size)

    71: {

    72: pType = new T[size];

    73: for (int i = 0; i< size; i++)

    74: pType[i] = 0;

    75: }

    76:

    77: // конструктор-копировщик

    78: template < class T>

    79: Array< T>:: Array(const Array & rhs)

    80: {

    81: itsSize = rhs.GetSize();

    82: pType = new T[itsSize];

    83: for (int i = 0; i< itsSize; i++)

    84: pType[i] = rhs[i];

    85: }

    86:

    87: // перегрузка оператора присваивания (=)

    88: template < class T>

    89: Array< T> & Array< T>:: operator=(const Array & rhs)

    90: {

    91: if (this == & rhs)

    92: return *this;

    93: delete [] pType;

    94: itsSize = rhs.GetSize();

    95: pType = new T[itsSize];

    96: for (int i = 0; i< itsSize; i++)

    97: pType[i] = rhs[i];

    98: return *this;

    99: }

    100:

    101: // управляющая программа

    102: int main()

    103: {

    104: Array< int> theArray; // массив целых

    105: Array< Animal> theZoo; // массив животных

    106: Animal *pAnimal;

    107:

    108: // заполняем массивы

    109: for (int i = 0; i < theArray.GetSize(); i++)

    110: {

    111: theArray[i] = i*2;

    112: pAnimal = new Animal(i*3);

    113: theZoo[i] = *pAnimal;

    114: }

    115:

    116: int j;

    117: for (j = 0; j < theArray.GetSize(); j++)

    118: {

    119: cout < < " theZoo[" < < j < < " ]: \t";

    120: theZoo[j].Display();

    121: cout < < endl;

    122: }

    123: cout < < " Now use the friend function to";

    124: cout < < " find the members of Array< int> ";

    125: Intrude(theArray);

    126:

    127: cout < < " \n\nDone.\n";

    128: return 0;

    129: }

     

    Результат:

    theZoo[0]: 0

    theZoo[1]: 3

    theZoo[2]: 6

    theZoo[3]: 9

    theZoo[4]: 12

    theZoo[5]: 15

    theZoo[6]: 18

    theZoo[7]: 21

    theZoo[8]: 24

    theZoo[9]: 27

    Now use the friend function to find the members of Array< int>

    *** Intrude ***

    i: 0

    i: 2

    i: 4

    i: 6

    i: 8

    i: 10

    i: 12

    i: 14

    i: 16

    i: 18

    Done.

     

    Анализ: Объявление шаблона Array было расширено за счет включения дружественной функции Intrude(). Это объявление означает, что каждый экземпляр массива типа int будет считать функцию Intrude() дружественной, а следовательно, она будет иметь доступ к закрытым переменным-членам и функциям-членам экземпляра этого массива.

    В строке 60 функция lntrude() непосредственно обращается к члену itsSize, а в строке 61 получает прямой доступ к переменной-члену pType. В данном случае без использования функции-друга можно было бы обойтись, поскольку класс Array предоставляет открытые методы доступа к этим данным. Этот листинг служит лишь примером того, как можно объявлять и использовать функции-друзья шаблонов.

     






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.