Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Освой ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π‘++ Π·Π° 21 дСнь.Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 142

Автор ДТСсс Π›ΠΈΠ±Π΅Ρ€Ρ‚ΠΈ

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ классы ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ конструктор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ лишь ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс. ΠŸΡ€ΠΈ этом Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΈ (частично ΠΈΠ· экономии мСста Π² листингС).

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ catch Π² строках 114-136 ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (thoException), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Ρ‚Π΅Π»Π΅ Π±Π»ΠΎΠΊΠ° catch для доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ, сохраняСмым Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Π΅ itsSize.


ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ слСдуСт ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎΠ± ΠΈΡ… сути: Ссли ΡƒΠΆ ΠΎΠ½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ, Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π΅ Π² порядкС с распрСдСлСниСм рСсурсов, ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ этого ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ вновь Π½Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Ρƒ ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли Π²Ρ‹ создаСтС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ OutOfMemory, Ρ‚ΠΎ Π½Π΅ стоит Π° конструкторС этого класса ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ для ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.


Π’Π΅ΡΡŒΠΌΠ° ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ всС эти конструкции с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ oatch, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ своС сообщСниС. Π’Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ объСма ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡΡ‚Ρ€Π΅ΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ возрастаСт Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ возникновСния Π² Π½Π΅ΠΉ ошибок. Π›ΡƒΡ‡ΡˆΠ΅ ΠΏΠ΅Ρ€Π΅Π»ΠΎΠΆΠΈΡ‚ΡŒ эту Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сам Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ сообщСниС. Π’ листингС 20.5 для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ использован ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² большСй стСпСни ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования. Π’ классах ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

Листинг 20.5. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠ°ΠΊ ссылок u использованиС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² классах ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

1: #include <iostream.h>

2:

3: const int DefaultSize = 10;

4:

5: class Array

6: {

7:    public:

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

9:      Array(int itsSize = DefaultSize);

10:      Array(const Array &rhs);

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

12:

13:      // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

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

15:      int& operator[](int offSet);

16:      const int& operator[](int offSet) const;

17:

18:      // ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ доступа

19:      int GetitsSize() const { return itsSize; }

20:

21:      // функция-Π΄Ρ€ΡƒΠ³

22:      friend ostream& operator<<

23:         (ostream&, const Array&);

24:

25:      // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ классов ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

26:      class xBoundary { };

27:      class xSize

28:      {

29:         public:

30:            xSize(int size):itsSize(size) { }

31:            ~xSize(){ }

32:            virtual int GetSize() { return itsSize; }

33:            virtual void PrintError()

34:            {

35:               cout << "Size error. Received: ";

36:               cout << itsSize << endl;

37:            }

38:         protected:

39:            int itsSize;

40:      };

41:

42:      class xTooBig : public xSize

43:      {

44:         public:

45:            xTooBig(int size):xSize(size){ }

46:            virtual void PrintError()

47:            {

48:               cout << "Too big. Received: ";

49:               cout << xSize::itsSize << endl;

50:            }

51:      };

52:

53:      class xTooSmall : public xSize

54:      {

55:         public:

56:            xTooSmall(int size):xSize(size){ }

57:            virtual void PrintError()

58:            {

59:               cout << "Too small. Received: ";

60:               cout << xSize::itsSize << endl;

61:            }

62:      };

63:

64:      class xZero : public xTooSmall

65:      {

66:         public:

67:            xZero(int size):xTooSmall(size){ }

68:            virtual void PrintError()

69:            {

70:               cout << "Zero!. Received: " ;

71:               cout << xSize::itsSize << endl;

72:            }

73:      };

74:

75:      class xNegative : public xSize

76:      {

77:         public:

78:            xNegative(int size):xSize(size){ }

79:            virtual void PrintError()

80:            {

81:               cout << "Negative! Received: ";

82:               cout << xSize::itsSize << endl;

83:            }

84:      };

85:

86:   private:

87:      int *pType;

88:      int itsSize;

89: };

90:

91: Array::Array(int size):

92: itsSize(size)

93: {

94:    if (size == 0)

95:       throw xZero(size);

96:    if (size > 30000)

97:       throw xTooBig(size);

98:    if (size <1)

99:       throw xNegative(size);

100:   if (size < 10)

101:      throw xTooSmall(size);

102:

103:   pType = new int[size];

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

105:      pType[i] = 0;

106: }

107:

108: int& Array::operator[] (int offSet)

109: {

110:    int size = GetitsSize();

111:    if (offSet >= 0 && offSet < GetitsSize())

112:       return pType[offSet];

113:    throw xBoundary();

114:    return pType[0];

115: }

116:

117: const int& Array::operator[] (int offSet) const

118: {

119:    int size = GetitsSize();

120:    if (offSet >= 0 && offSet < GetitsSize())

121:       return pType[offSet];

122:    throw xBoundary();

123:    return pType[0];

124: }

125:

126: int main()

127: {

128:

129:    try

130:    {

131:       Array intArray(9);

132:       for (int j = 0: j< 100; j++)

133:       {

134:          intArray[j] - j;

135:          cout << "intArray[" << j << "] okay...\n";

136:       }

137:    }

138:    catch (Array::xBoundary)

139:    {

140:       cout << "Unable to process your input!\n";

141:    }

142:    catch (Array;:xSize& theExoeption)

143:    {

144:       theException.PrintError();

145:    }

146:    catch (...)

147:    {

148:       cout << "Something went wrong!\n";

149:    }

150:    cout << "Done.\n";

151:    return 0;

152: }


Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Too small! Received: 9

Done.


Анализ: Π’ листингС 20.5 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ объявлСниС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° PrintError() Π² классС xSize, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΈ истинный Ρ€Π°Π·ΠΌΠ΅Ρ€ класса. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π·Π°ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ΡΡ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

Π’ строкС 142 ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ссылкой. ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PrintError() со ссылкой Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ благодаря ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΡƒ вызываСтся нуТная вСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PrintError(). Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ становится яснСС, ΠΏΡ€ΠΎΡ‰Π΅ для понимания, Π° ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈ для дальнСйшСй ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ.

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹

ΠŸΡ€ΠΈ создании ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с шаблонами, Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ. МоТно ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ прямо Π² шаблонС, ΠΈ Ρ‚ΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ доступны для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ экзСмпляра шаблона, Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ классы ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, созданныС Π²Π½Π΅ объявлСния шаблона. Оба этих ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π² листингС 20.6.

Листинг 20.6. ИспользованиС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ с шаблонами

1: #include <iostream.h>

2:

3: const int DefaultSize = 10;

4: class xBoundary { } ;

5:

6: template <class T>

7: class Array

8: {

9:    public:

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

11:      Array(int itsSize = DefaultSize);

12:      Array(const Array &rhs);

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

14:

15:      // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

16:      Array& operator=(const Array<T>&);

17:      T& operator[](int offSet);

18:      const T& operator[](int offSet) const;

19:

20:      // ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ доступа

21:      int GetitsSize() const { return itsSize; }

22:

23:      // функция-Π΄Ρ€ΡƒΠ³

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

25:

26:      // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ классов ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

27:

28:      class xSize { };

29:

30:   private:

31:      int *pType;

32:      int itsSize;

33: };

34:

35: template <class T>

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

37: itsSize(size)

38: {

39:    if (size <10 || size > 30000)

40:       throw xSize();

41:    Ρ€Π’ΡƒΡ€Π΅ = new T[size];

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

43:       pType[i] = 0;

44: }

45:

46: template <class T>

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

48: {

49:    if (this == &rhs)

50:       return *this;

51:    delete [] Ρ€Π’ΡƒΡ€Π΅;

52:    itsSize = rhs.GetitsSize();

53:    Ρ€Π’ΡƒΡ€Π΅ = new T[itsSize];

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

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

56: }

57: template <class T>

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

59: {

60:    itsSize = rhs.GetitsSize();

61:    Ρ€Π’ΡƒΡ€Π΅ = new T[itsSize];

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

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

64: }

65:

66: template <class T>

67: T& Array<T>::operator[](int offSet)

68: {

69:    int size = GetitsSize();

70:    if (offSet >= 0 && offSet < GetitsSize())

71:       return pType[offSet];

72:    throw xBoundary():

73:    return pType[0];

74: }

75:

76: template <class T>

77: const T& Array<T>::operator[](int offSet) const

78: {

79:    int mysize = GetitsSize();

80:    if (offSet >= 0 && offSet < GetitsSize())

81:       return pType[offSet];

82:    throw xBoundary();

83: }

84:

85: template <class T>

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

87: {

88:    for (int i = 0; i<theArray,GetitsSize(); i++)

89:       output << "[" << i << "] " << theArray[i] << endl;

90:    return output;

91: }

92:

93:

94: int main()

95: {

96:

97:    try

98:    {

99:       Array<int> intArray(9);

100:      for (int j = 0; j< 100; j++)

101:      {

102:         intArray[j] = j;

103:         cout << "intArray[" << j << "] okay..." << endl;