Выбрать главу

Предупреждение:Если ваш компилятор не поддерживает шаблоны или блоки try и catch, вы не сможете скомпилировать эту программу.

Листинг 3.1. Программа, основанная на материалах недели 3

1:  // ************************************

2:  //

3:  // Название: Обзор недели 3

4:  //

5:  // Файл: Week3

6:  //

7:  // Описание: Программа с использованием связанного списка

8:  // на основе шаблона с обработкой исключительных ситуаций

9:  //

10: // Классы: PART - хранит номера запчастей и потенциально другую

11: // информацию о запчастях. Зто будет

12: // пример класса для хранения списка.

13: // Обратите внимание на использование

14: // оператора << для печати информации о запчасти

15: // на основе его типа и времени выполнения,

16: //

17: //      Node - действует как узел в классе List

18: //

19: //      List - список, основанный на шаблоне, который

20: // обеспечивает работу связанного списка

21: //

22: //

23: // Автор: Jesse Liberty (jl)

24: //

25: // Разработан: Pentium 200 Pro. 128MB RAM MVC 5.0

26: //

27: // Требования: Не зависит от платформы

28: //

29: // История создания: 9/94 - Первый выпуск (jl)

30: //             4/97 - Обновлено (jl)

31: // ************************************

32:

33: #include <iostream.h>

34:

35: // классы исключений

36: class Exception { };

37: class OutOfMemory : public Exception{ };

38: class NullNode : public Exception{ };

39: class EmptyList : public Exception { };

40: class BoundsError : public Exception { };

41:

42:

43: // **************** Part **************

44: // Абстрактный базовый класс запчастей

45: class Part

46: {

47:    public:

48:       Part():its0bjectNumber(1) { }

49:       Part(int 0bjectNumber):its0bjectNumber(ObjectNumber){ }

50:       virtual ~Part(){ };

51:       int GetObjectNumber() const { return itsObjectNumber; }

52:       virtual void Display() const =0; // функция будет замещена в производном классе

53:

54:    private:

55:       int itsObjectNumber;

56: };

57:

58: // выполнение чистой виртуальной функции, необходимой

59: // для связывания объектов производного класса

60: void Part::Display() const

61: {

62:    cout << "\nPart Number: " << itsObjectNumber << endl;

63: }

64:

65: // Этот оператор << будет вызываться для всех объектов запчастей.

66: // Его не нужно объявлять другом, поскольку он не обращается к закрытым данным.

67: // Он вызывает метод Display(), в результате чего реализуется полиморфизм классов.

68: // Было бы не плохо замещать функцию оператора для разных

69: // типов thePart, но C++ не поддерживает контравариантность

70: ostream& operator<<( ostream& theStream,Part& thePart)

71: {

72:    thePart.Display(); // косвенная реализация полиморфизма оператора вывода!

73:    return theStream;

74: }

75:

76: // **************** Car Part ************

77: class CarPart : public Part

78: {

79:    public:

80:       CarPart():itsModelYear(94){ }

81:       CarPart(int year, int partNumber);

82:       int GetModelYear() const { return itsModelYear; }

83:       virtual void Display() const;

84:    private:

85:       int itsModelYear;

86: };

87:

88: CarPart::CarPart(int year, int partNumber):

89: itsModelYear(year),

90: Part(partNumber)

91: { }

92:

93: void CarPart::Display() const

94: {

95:    Part::Display();

96:    cout << "Model Year: " << itsModelYear << endl;

97: }

98:

99:  // **************** AirPlane Part ************

100: class AirPlanePart : public Part

101: {

102:    public:

103:       AirPlanePart():itsEngineNumber(1){ } ;

104:       AirPlanePart(int EngineNumber, int PartNumber);

105:       virtual void Display() const;

106:       int GetEngineNumber()const { return itsEngineNumber; }

107:    private:

108:       int itsEngineNumber;

109: };

110:

111: AirPlanePart::AirPlanePart(int EngineNumber, int PartNumber):

112: itsEngineNumber(EngineNumber),

113: Part(PartNumber)

114: { }

115:

116: void AirPlanePart::Display() const

117: {

118:    Part::Display();

119:    cout << "Engine No,: " << itsEngineNumber << endl;

120: }

121:

122: // Обьявление класса List

123: template <class T>

124: class List;

125:

126: // **************** Node ************

127: // Общий узел, который можно добавить к списку

128: // **********************************

129:

130: template <class T>

131: class Node

132: {

133:    public:

134:       friend class List<T>;

135:       Node (T*);

136:       ~Node();

137:       void SetNext(Node * node) { itsNext = node; }

138:       Node * GetNext() const;

139:       T * GetObject() const;

140:    private:

141:       T* its0bject;

142:       Node * itsNext;

143: };

144:

145: // Выполнение узла...

146:

147: template <class T>

148: Node<T>::Node(T* p0jbect):

149: itsObject(pOjbect),

150: itsNext(0)

151: { }

152:

153: template <class T>