Программирование >>  Дополнительные возможности наследования 

1 ... 191 192 193 [ 194 ] 195 196 197 ... 265


Aucmuia 18.2. Исюиьзоовиио шаО виа массива

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 49

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::Animal(): 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; }

private: T .pType; int itsSize;



выполнения...

выполняем конструктор template <class Т> Аггау<Т>::Array(int size): itsSize(size) {

рТуре = new T[size]: for (int i = 0; i<size; i++) pType[i] = 0;

>

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

template <class T>

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

itsSize = rhs.GetSizeO; pType = new T[itsSize]: for (int i = 0: i<itsSize: i++) pType[i] = rhs[i];

II оператор присваивания 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;

>

исполняемая программа

int main()

Array<int> theArray; массив целых Array<Animal> theZoo; массив животных Animal *pAnimal;

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

for-(int i = 0; i < theArray.GetSizeO; i++) {

theArray[i] = i*2; pAnimal = new Animal(i*3); theZoo[i] = pAnimal:



100 101 102 103 104 105 106 107 108 109 110 111 112 113

delete pAnimal;

выводим на печать содержимое массивов for (int ] = 0; j < theArray.GetSizeO; {

cout theArrayL j ЗД f; cout theArray[j] Л t\ f; cout theZoo[ j JA t ; theZoo[j]. DisplayO; cout endl;

return 0;

резу1шт

theArray[0]

theZoo[0]

theArray[1]

theZoo[1]

theArray[2]

theZoo[2]

theArray[3]

theZoo[3]

theArray[4]

theZoo[4]

theArray[5]

theZoo[5]

theArray[6]

theZoo[6]

theArray[7]

theZoo[7]

theArray[8]

theZoo[8]

theArray[9]

theZoo[9]

В строках 8-26 вьшолняется создание класса Animal, благодаря которому объекты определяемого пользователем типа можно будет добавлять в массив. Содержимое строки 29 означает, что в следующих за ней строках объявляется шаблон, параметром для которого является тип, обозначенный идентификатором Т. Класс Array содержит два конструктора, причем первый конструктор принимает размер и по умолчанию устанавливает его равным значению целочисленной константы DefaultSize.

Затем объявляются операторы присваивания и индексирования, причем объявляются константная и неконстантная версии оператора индексирования. В качестве единственного метода доступа служит функция GetSizeO, которая возвращает размер массива.

Можно, конечно, представить себе и более полный интерфейс. Ведь для любой серьезной профаммы создания массива представленный здесь вариант будет недостаточным. Как минимум, пришлось бы добавить операторы, предназначенные для удаления элементов, для распаковки и упаковки массива и т.д. Все это предусмотрено классами контейнеров библиотеки STL, но к этому мы вернемся в конце занятия.

Раздел закрытых данных содержит переменные-члены размера массива и указатель на массив объектов, реально помещенных в память.

Щит набша

Если вы хотите передать функции объект массива, нужно передавать конкретный экземпляр массива, а не шаблон. Поэтому, если некоторая функция Some Funct ion () принимает в качестве параметра целочисленный массив, используйте следующую запись;

void SomeFunction(Array<int>&); правильно



1 ... 191 192 193 [ 194 ] 195 196 197 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика