Освой самостоятельно С++ за 21 день.
Шрифт:
25: }
26:
27: // ************ Автомобильные детали **********
28:
29: class CarPart : public Part
30: {
31: public:
32: CarPart:itsModelYear(94){ }
33: CarPart(int year, int partNumber);
34: virtual void Display const
35: {
36: Part::Display;
37: cout << "Model Year: ";
38: cout << itsModelYear << endl;
39: }
40: private:
41: int itsModelYear;
42: };
43:
44: CarPart::CarPart(int year, int partNumber):
45: itsModelYear(year),
46: Part(partNumber)
47: { }
48:
49:
50: // *************
51:
52: class AirPlanePart : public Part
53: {
54: public:
55: AirPlanePart:itsEngineNumber(1){ }
56: AirPlanePart
57: (int EngineNumber, int PartNumber)
58: virtual void Dlsplay const
59: {
60: Part::Display;
61: cout << " Engine No.: ";
62: cout << itsEngineNumber << endl;
63: }
64: private:
65: int itsEngineNumber;
66: };
67:
68: AirPlanePart::AirPlanePart
69: (int EngineNumber, int PartNumber):
70: itsEngineNumber(EngineNumber),
71: Part(PartNumber)
72: { }
73:
74: // *************** Узлы списка деталей **********
75: class PartNode
76: {
77: public:
78: PartNode (Part*);
79: ~PartNode;
80: void SetNext(PartNode * node)
81: { itsNext = node; }
82: PartNode * GetNext const;
83: Part * GetPart const;
84: private:
85: Part *itsPart;
86: PartNode * itsNext;
87: };
88: // Выполнение PartNode...
89:
90: PartNode::PartNode(Part* pPart):
91: itsPart(pPart),
92: itsNext(0)
93: { }
94:
95: PartNode::~PartNode
96: {
97: delete itsPart;
98: itsPart = 0;
99: delete itsNext;
100: itsNext = 0;
101: }
102:
103: // Возвращается NULL, если нет следующего узла PartNode
104: PartNode * PartNode::GetNext const
105: {
106: return itsNext;
107: }
108:
109: Part * PartNode::GetPart const
110: {
111: if (itsPart)
112: return itsPart;
113: else
114: return NULL; //ошибка
115: }
116:
117:
118:
119: // ****************
120: class PartsList
121: {
122: public:
123: PartsList;
124: ~PartsList;
125: // необходимо, чтобы конструктор-копировщик и оператор соответствовали друг другу!
126: void Iterate(void (Part::*f)const) const;
127: Part* Find(int & position, int PartNumber) const;
128: Part* GetFirst const;
129: void Insert(Part *);
130: Part* operator[](int) const;
131: int GetCount const { return itsCount;}
132: static PartsList& GetGlobalPartsList
133: {
134: return GiobalPartsList;
135: }
136: private:
137: PartNode * pHead;
138: int itsCount;
139: static PartsList GiobalPartsList;
140: };
141:
142: PartsList PartsList::GlobalPartsList;
143:
144:
145: PartsList::PartsList:
146: pHead(0),
147: itsCount(0)
148: { }
149:
150: PartsList::~PartsList
151: {
152: delete pHead;
153: }
154:
155: Part* PartsList::GetFirst const
156: {
157: if (pHead)
158: return pHead->GetPart;
159: else
160: return NULL; // ловушка ошибок
161: }
162:
163: Part * PartsList::operator[](int offSet) const
164: {
165: PartNode* pNode = pHead;
166:
167: if (!pHead)
168: return NULL; // ловушка ошибок
169:
170: if (offSet > itsCount)
171: return NULL; // ошибка
172:
173: for (int i=0;i<offSet; i++)
174: pNode = pNode->GetNext;
175:
176: return pNode->GetPart;
177: }
178:
179: Part* PartsList::Find(
180: int & position,
181: int PartNumber) const
182: {
183: PartNode * pNode = 0;
184: for (pNode = pHead, position = 0;
185: pNode!=NULL;
186: pNode = pNode->GetNext, position++)
187: {
188: if (pNode->GetPart->GetPartNumber== PartNumber)
189: break;
190: }
191: if (pNode == NULL)