Чтение онлайн

ЖАНРЫ

Освой самостоятельно С++ за 21 день.

Либерти Джесс

Шрифт:

Предупреждение:Если ваш компилятор не поддерживает шаблоны или блоки 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 GetEngineNumberconst { 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: // Выполнение узла...

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