Студопедия

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

КАТЕГОРИИ:

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






Листинг 18.4. Использование оператора вывода






1: #include < iostream.h>

2:

3: const int DefaultSize = 10;

4:

5: class Animal

6: {

7: public:

8: Animal(int);

9: Animal();

10: ~Animal() { }

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

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

13: private:

14: int itsWeight;

15: };

16:

17: Animal:: Animal(int weight):

18: itsWeight(weight)

19: { }

20:

21: Animal:: Animal():

22: itsWeight(0)

23: { }

24:

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

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

27: {

28: public:

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

30: Array(int itsSize = DefaultSize);

31: Array(const Array & rhs);

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

33:

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

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

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

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

38: { return pType[offSet]; }

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

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

41:

42: friend ostream& operator< < (ostream&, Array< T> &);

43:

44: private:

45: T *pType;

46: int itsSize;

47: };

48:

49: template < class T>

50: ostream& operator< < (ostream& output, Array< T> & theArray)

51: {

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

53: output < < " [" < < i < < " ] " < < theArray[i] < < endl; return output;

54: }

55:

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

57:

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

59: template < class T>

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

61: itsSize(size)

62: {

63: pType = new T[size];

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

65: pType[i] = 0;

66: }

67:

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

69: template < class T>

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

71: {

72: itsSize = rhs.GetSize();

73: pType = new T[itsSize];

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

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

76: }

77:

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

79: template < class T>

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

81: {

82: if (this == & rhs)

83: return *this;

84: delete [] pType;

85: itsSize = rhs.GetSize();

86: pType = new T[itsSize];

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

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

89: return *this;

90: }

91:

92: int main()

93: {

94: bool Stop = false; // признак для цикла

95: int offset, value;

96: Array< int> theArray;

97:

98: while (! Stop)

99: {

100: cout < < " Enter an offset (0-9) ";

101: cout < < " and a value. (-1 to stop): ";

102: cin > > offset > > value;

103:

104: if (offset < 0)

105: break;

106:

107: if (offset > 9)

108: {

109: cout < < " ***Please use values between 0 and 9.***\n";

110: continue;

111: }

112:

113: theArray[offset] = value;

114: }

115:

116: cout < < " \nHere's the entire array: \n";

117: cout < < theArray < < endl;

118: return 0;

119: }

 

Результат:

Enter an offset (0 -9 and а value. (-1 to stop) 1 10

Enter an offset (0 -9 and а value. (-1 to stop) 2 20

Enter an offset (0 -9 and а value. (-1 to stop) 3 30

Enter an offset (0 -9 and а value. (-1 to stop) 4 40

Enter an offset (0 -9 and а value. (-1 to stop) 5 50

Enter an offset (0 -9 and а value. (-1 to stop) 6 60

Enter an offset (0 -9 and а value. (-1 to stop) 7 70

Enter an offset (0 -9 and а value. (-1 to stop) 8 80

Enter an offset (0 -9 and а value. (-1 to stop) 9 90

Enter an offset (0 -9 and а value. (-1 to stop) 1С 10

***Please use values between 0 and 9.* > > *

Enter an offset (0 -9) and а value. (-1 to stop) -1 -1

Here's the entire array:

[0] 0

[1] 10

[2] 20

[3] 30

[4] 40

[5] 50

[6] 60

[7] 70

[8] 80

[9] 90

 

Анализ: В строке 42 объявляется шаблон функции operator< < () в качестве друга шаблона класса Array. Поскольку operator< < () реализован в виде функции шаблона, то каждый экземпляр этого типа параметризованного массива будет автоматически иметь функцию operator< < () для вывода данных соответствующего типа. Выполнение этого оператора начинается в строке 49. Каждый член массива вызывается по очереди. Этот метод работает только в том случае, если функция operator< < () определена для каждого типа объекта, сохраняемого в массиве.

 

 


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

mylektsii.su - Мои Лекции - 2015-2024 год. (0.013 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал