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

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

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

ΠžΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с рядом Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массива. Π—Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ ввСсти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -5. Π’Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ xNegative, Π½ΠΎ этому ΠΏΠΎΠΌΠ΅ΡˆΠ°Π΅Ρ‚ порядок ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π² конструкторС: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° size < 10 выполняСтся Π΄ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ size < 1. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ этот нСдостаток, помСняйтС строки 61 ΠΈ 62 со строками 65 ΠΈ 66 ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.

НаслСдованиС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ β€” это классы, Π° Ρ€Π°Π· Ρ‚Π°ΠΊ, Ρ‚ΠΎ ΠΎΡ‚ Π½ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ классы. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ класс xSize ΠΈ произвСсти ΠΎΡ‚ Π½Π΅Π³ΠΎ классы xZero, xTooSmall, xTooBig ΠΈ xNegative. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ для ΠΎΠ΄Π½ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ ошибки xSize, Π° для Π΄Ρ€ΡƒΠ³ΠΈΡ… β€” ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ Ρ‚ΠΈΠΏΠΎΠ² ошибок, ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… ΠΎΡ‚ xSize. РСализация этой ΠΈΠ΄Π΅ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π² листингС 20.3.

Листинг 20.3. НаслСдованиС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

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<< (ostream&, const Array&);

23:

24:      // опрСдСлСния классов ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

25:      class xBoundary { };

26:      class xSize { };

27:      class xTooBig : public xSize { };

28:      class xTooSmall : public xSize { };

29:      class xZero : public xTooSmall { };

30:      class xNegative : public xSize { };

31:   private:

32:      int *pType;

33:      int itsSize;

34: };

35:

36:

37: Array::Array(int size):

38: itsSize(size)

39: {

40:    if (size β€” 0)

41:       throw xZero();

42:    if (size > 30000)

43:       throw xTooBig();

44:    if (size <1)

45:       throw xNegative();

46:    if (size < 10)

47:       throw xTooSmall();

48:

49:    pType = new int[size];

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

51:       pType[i] = 0;

52: }

53:

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

55: {

56:    int size = GetitsSize();

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

58:       return pType[offSet];

59:    throw xBoundary();

60:    return pType[0]; // Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ компилятора

61: }

62:

63:

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

65: {

66:    int mysize = GetitsSize();

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

68:       return pType[offSet];

69:    throw xBoundary();

70:

71:    return pType[0]; // Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ компилятора

72: }

73:

74: int main()

75: {

76:

77:    try

78:    {

79:       Array intArray(0);

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

81:       {

82:          intArray[j ] = j;

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

84:       }

85:    }

86:    catch (Array::xBoundary)

87:    {

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

89:    }

90:    catch (Array::xTooBig)

91:    {

92:       cout << "This array is too big...\n";

93:    }

94:

95:    catch (Array::xTooSmall)

96:    {

97:       cout << "This array is too small...\n";

98:    }

99:    catch (Array::xZero)

100:   {

101:      cout << "You asked for an array";

102:      cout << " of zero objects!\n";

103:   }

104:

105:

106:   catch (.. .)

107:   {

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

109:   }

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

111:   return 0;

112: }


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

This array is too small...

Done.


Анализ: Π—Π΄Π΅ΡΡŒ сущСствСнно ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ строки 27β€”30, Π³Π΄Π΅ устанавливаСтся иСрархия классов. ΠšΠ»Π°ΡΡΡ‹ xTooBig, xTooSmall ΠΈ xNegative ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Ρ‹ ΠΎΡ‚ класса xSize, Π° класс xZero β€” ΠΎΡ‚ класса xTooSmall.

Класс Array создаСтся с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ, Π½ΠΎ Ρ‡Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚? Казалось Π±Ρ‹, Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΡƒΡ‚ ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½ΠΎ! Однако Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ исслСдуйтС Π±Π»ΠΎΠΊ catch, ΠΈ Π²Ρ‹ ΠΏΠΎΠΉΠΌΠ΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° xZero, Π² Π½Π΅ΠΌ ищСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° xTooSmall. А ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²ΠΎΠ·Π½ΠΈΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса xZero, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ класса xTooSmall, Ρ‚ΠΎ ΠΎΠ½ пСрСхватываСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ xTooSmall. Π‘ΡƒΠ΄ΡƒΡ‡ΠΈ ΡƒΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΌ, это ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ пСрСдаСтся Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° xZero Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ вызываСтся.

РСшСниС этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π»Π΅ΠΆΠΈΡ‚ Π² Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ упорядочСнии ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ самыС спСцифичСскиС ΠΈΠ· Π½ΠΈΡ… стояли Π² Π½Π°Ρ‡Π°Π»Π΅, Π° Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰ΠΈΠ΅ слСдовали Π·Π° Π½ΠΈΠΌΠΈ. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ достаточно ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ мСстами Π΄Π²Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° β€” xZero ΠΈ xTooSmall.

Π”Π°Π½Π½Ρ‹Π΅ Π² классах ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈ присвоСниС ΠΈΠΌΠ΅Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

Часто для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠ³Π»Π° ΠΎΡ‚Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π½Π°Ρ‚ΡŒ нСсколько большС, Ρ‡Π΅ΠΌ просто Ρ‚ΠΈΠΏ возникшСго ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. ΠšΠ»Π°ΡΡΡ‹ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ β€” это Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ классы, ΠΊΠ°ΠΊ ΠΈ Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. Π’Ρ‹ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ свободно ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² эти классы, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора ΠΈ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… значСния Π² любоС врСмя, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 20.4.

Листинг 20.4. Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

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<< (ostream&, const Array&);

23:

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

25:      class xBoundary { };

26:      class xSize

27:      {

28:         public:

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

30:            ~xSize(){ }

31:            int GetSize() { return itsSize; }

32:         private:

33:            int itsSize;

34:      };

35:

36:      class xTooBig : public xSize

37:      {

38:         public:

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

40:      };

41:

42:      class xTooSmall : public xSize

43:      {

44:         public:

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

46:      };

47:

48:      class xZero : public xTooSmall

49:      {

50:         public:

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

52:      };

53:

54:      class xNegative : public xSize

55:      {

56:         public:

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

58:      };

59:

60:   private:

61:      int *pType;

62:      int itsSize;

63: };

64:

65:

66: Array::Array(int size):

67: itsSize(size)

68: {

69:    if (size == 0)

70:       throw xZero(size);

71:    if (size > 30000)

72:       throw xTooBig(size);

73:    if (size <1)

74:       throw xNegative(size);

75:    if (size < 10)

76:       throw xTooSnall(size);

77:

78:    pType = new int[size];

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

80:       pType[i] = 0;

81: }

82:

83:

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

85: {

86:    int size = GetitsSize();

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

88:       return pType[offSet];

89:    throw xBoundary();

90:    return pType[0];

91: }

92:

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

94: {

95:    int size = GetitsSize();

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

97:       return pType[offSet];

98:    throw xBoundary();

99:    return pType[0];

100: }

101:

102: int main()

103: {

104:

105:    try

106:    {

107:       Array intArray(9);

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

109:       {

110:          intArray[j] = j;

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

112:       }

113:    }

114:    catch (Array::xBoundary)

115:    {

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

117:    }

118:    catch(Array::xZero theException)

119:    {

120:       cout << "You asked for an Array of zero objectsl " << endl;

121:       cout << "Received " << theExesptiQn,GatSize() << endl;

122:    }

123:    catch (Array:;xTooBig theException)

124:    {

125:       cout << "This Array is too big,,, " << endl;

126:       cout << "Received " << theException,GetSize() << endl;

127:    }

128:    catch (Array;:xTooSmall theException)

129:    {

130:       cout << "This Array is too small... " << endl;

131:       cout << "Received " << theException.GetSize() << endl;

132:    }

133:    catch (...)

134:    {

135:       cout << "Something went wrong, but I've no idea what!\n";

136:    }

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

138:    return 0;

139: }


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

This array is too small...

Received 9

Done.


Анализ: ОбъявлСниС класса xSize Π±Ρ‹Π»ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ-Ρ‡Π»Π΅Π½ itsSize (строкаЗЗ) ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ GetSize() (строка 31). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π±Ρ‹Π» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ конструктор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ†Π΅Π»ΠΎΠ΅ число ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ-Ρ‡Π»Π΅Π½, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² строкС 29.