Студопедия

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

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

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






Листинг 19.2. Использвание шаблона массива






1: #include < iostream.h>

2:

3: const int DefaultSize = 10;

4:

5: // обычный класс Animal для

6: // создания массива животных

7:

8: class Animal

9: {

10: public:

11: Animal(int);

12: Animal();

13: ~Animal() { }

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

15: void Display() const { cout < < itsWeight; }

16: private:

17: int itsWeight;

18: };

19:

20: Animal:: Animal(int weight):

21: itsWeight(weight)

22: { }

23:

24: Animal:: Animal():

25: itsWeight(0)

26: { }

27:

28:

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

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

31: {

32: public:

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

34: Array(int itsSize - DefaultSize);

35: Array(const Array & rhs);

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

37:

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

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

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

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

42: { return pType[offSet]; }

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

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

45:

46: private:

47: T *рТуре;

48: int itsSize;

49: };

50:

51: // выполнения...

52:

53: // выполняем конструктор

54: template < class T>

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

56: itsSize(size)

57: {

58: pType = new T[size];

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

60: pType[i] = 0;

61: }

62:

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

64: template < class T>

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

66: {

67: itsSize = rhs.GetSize();

68: pType = new T[itsSize];

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

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

71: }

72:

73: // оператор присваивания

74: template < class T>

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

76: {

77: if (this == & rhs)

78: return *this;

79: delete [] pType;

80: itsSize = rhs.GetSize();

81: pType = new T[itsSize];

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

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

84: return *this;

85: }

86:

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

88: int main()

89: {

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

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

92: Animal *pAnimal;

93:

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

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

96: {

97: theArray[i] = i*2;

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

99: theZoo[i] = *pAnimal;

100: delete pAnimal;

101: }

102: // выводим на печать содержимое массивов

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

104: {

105: cout < < " theArray[" < < j < < " ]: \t";

106: cout < < theArray[j] < < " \t\t";

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

108: theZoo[j].Display();

109: cout < < endl;

110: }

111:

112: return 0;

113: }

 

Результат:

theArray[0] 0 theZoo[0] 0

theArray[1] 2 theZoo[1] 3

theArray[2] 4 theZoo[2] - 6

theArray[3] 6 theZoo[3] 9

theArray[4] 8 theZoo[4] 12

theArray[5] 10 theZoo[5] 15

theArray[6] 12 theZoo[6] 18

theArray[7] 14 theZoo[7] 21

theArray[8] 16 theZoo[8] 24

theArray[9] 18 theZoo[9] 27

 

Анализ: В строках 8-26 выполняется создание класса Animal, благодаря которому объекты определяемого пользователем типа можно будет добавлять в массив.

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

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

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

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

 

 






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