Освой самостоятельно С++ за 21 день.
Шрифт:
75: {
76: Part::Display; cout << "Номер двигателя: ";
77: cout << itsEngineNumber << endl;
78: }
79: private:
80: int itsEngineNumber;
81: };
82:
83: AirPlanePart::AirPlanePart(int EngineNumber, intPartNumber):
84: itsEngineNumber(EngineNumber),
85: Part(PartNumber)
86: { }
87:
88: // ************** Узлы списка деталей **********
89: class PartNode
90: {
91: public:
92: PartNode (Part*);
93: ~PartNode;
94: void SetNext(PartNode * node) { itsNext = node; }
95: PartNode * GetNext const;
96: Part * GetPart const;
97: private:
98: Part *itsPart;
99: PartNode * itsNext;
100: };
101:
102: //
103:
104: PartNode::PartNode(Part* pPart):
105: itsPart(pPart),
106: itsNext(0)
107: { }
108:
109: PartNode::~PartNode
110: {
111: delete itsPart;
112: itsPart = 0;
113: delete itsNext;
114: itsNext = 0;
115: }
116:
117: //Возвращается NULL, если нет следующего узла PartNode
118: PartNode * PartNode::GetNext const
119: {
120: return itsNaxt;
121: }
122:
123: Part * PartNode::GetPart const
124: {
125: if (itsPart)
126: return itsPart;
127: else
128: return NULL; // ошибка
129: }
130:
131: // **************** Список деталей ************
132: class PartsList
133: {
134: public:
135: PartsList;
136: ~PartsList;
137: // Необходимо, чтобы конструктор-копировщик и оператор соответствовали друг другу!
138: Part* Find(int & position, int PartNumber) const;
139: int GetCount const { return itsCount; }
140: Part* GetFirst const;
141: static PartsList& GetGlobalPartsList
142: {
143: return GlobalPartsList;
144: }
145: void Insert(Part *);
146: void Iterate(void (Part::*f)const) const;
147: Part* operator[](int) const;
148: private:
149: PartNode * pHead;
150: int itsCount;
151: static PartsList GlobalPartsList;
152: };
153:
154: PartsList PartsList::GlobalPartsList;
155:
156: // Выполнение списка...
157:
158: PartsList::PartsList:
159: pHead(0),
160: itsCount(0)
161: { }
162:
163: PartsList::^PartsList
164: {
165: delete pHead;
166: }
167:
168: Part* PartsList::GetFirst const
169: {
170: if (pHead)
171: return pHead->GetPart;
172: else
173: return NULL; //
ловушка ошибок174: }
175:
176: Part * PartsList::operator[](int offSet) const
177: {
178: PartNode* pNode = pHead;
179:
180: if (!pHead)
181: return NULL; // ловушка ошибок
182:
183: if (offSet > itsCount)
184: return NULL; // ошибка
185:
186: for (int i=0;i<offSet; i++)
187: pNode = pNode->GetNext;
188:
189: return pNode->GetPart;
190: }
191:
192: Part* PartsList::Find(int & position, int PartNumber) const
193: {
194: PartNode * pNode = 0;
195: for (pNode = pHead, position = 0;
196: pNode!=NULL;
197: pNode = pNode->GetNext, position++)
198: {
199: if (pNode->GetPart->GetPartNumber == PartNumber)
200: break;
201: }
202: if (pNode == NULL)
203: return NULL;
204: else
205: return pNode->GetPart;
206: }
207:
208: void PartsList::Iterate(void (Part::*func)const) const
209: {
210: if (!pHead)
211: return;
212: PartNode* pNode = pHead;
213: do
214: (pNode->GetPart->*func);
215: while (pNode = pNode->GetNext);
216: }
217:
218: void PartsList::Insert(Part* pPart)
219: {
220: PartNode * pNode = new PartNode(pPart);
221: PartNode * pCurrent = pHead;
222: PartNode >> pNext = 0;
223:
224: int New = pPart->GetPartNumber;
225: int Next = 0;
226: itsCount++;
227:
228: if (!pHead)
229: {
230: pHead = pNode;
231: return;
232: }
233:
234: // Если это значение меньше головного узла,
235: // то текущий узел становится головным
236: if (pHead->GetPart->GetPartNumber->New)
237: {
238: pNode->SetNext(pHead);
239: pHead = pHode;
240: return;
241: }
242:
243: for (;;)
244: {
245: // Если нет следующего, вставляется текущий
246: if (!pCurrent->GetNext)
247: {
248: pCurrent->SetNext(pNode);
249: return;
250: }
251:
252: // Если текущий больше предыдущего, но меньше следующего, то вставляем
253: // здесь. Иначе присваиваем значение указателя Next
254: pNext = pCurrent->GetNext;
255: Next = pNext->GetPart->GetPartNumber;