Листинг 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. Обратите внимание, что при обращении к статической переменной-члену необходимо указать тип массива, так как для каждого типа будет создана своя статическая переменная-член.

 

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

 

 


Дата добавления: 2019-02-12; просмотров: 211; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!