Студопедия

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

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

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






  • Как продвинуть сайт на первые места?
    Вы создали или только планируете создать свой сайт, но не знаете, как продвигать? Продвижение сайта – это не просто процесс, а целый комплекс мероприятий, направленных на увеличение его посещаемости и повышение его позиций в поисковых системах.
    Ускорение продвижения
    Если вам трудно попасть на первые места в поиске самостоятельно, попробуйте технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Если ни один запрос у вас не продвинется в Топ10 за месяц, то в SeoHammer за бустер вернут деньги.
    Начать продвижение сайта
  • Листинг 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. Обратите внимание, что при обращении к статической переменной-члену необходимо указать тип массива, так как для каждого типа будет создана своя статическая переменная-член.

     

    Рекомендуется: Используйте статические члены в шаблонах. Специализируйте выполнение шаблона путем замещения функций шаблона для разных типов. Указывайте параметр типа при вызове статических функций шаблона, чтобы получить доступ к функции требуемого типа.

     

     






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