|
Программирование >> Дополнительные возможности наследования
232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 return; for (;;) { если нет следующего, вставляется текущий if (!pCurrent->itsNext) pCurrent->itsNext = pNode; return; если текущий больше предыдущего, но меньше следующего, то вставляем здесь. Иначе присваиваем значение указателя Next pNext = pCurrent->itsNext; Next = pNext->itsPart->GetPartNumber(); if (Next > New) pCurrent->itsNext = pNode; pNode->itsNext = pNext; return; pCurrent = pNext; class PartsCatalog : private PartsList { public: void Insert(Part ♦); int Exists(int PartNumber); Part * Get(int PartNumber); operator+(const PartsCatalog &); void ShowAlK) { Iterate(Part: :Display); } private: } ; void PartsCatalog::Insert(Part newPart) { int partNumber = newPart->GetPartNumber(); int offset; if (!Find(offset, partNumber)) PartsList::Insert(newPart); else { cout << partNumber << was the ; switch (offset) case 0: cout first ; break; 282; case 1: cout second ; break; 283: case 2: cout third ; break; 284: default: cout offset+1 th ; 285: } 286: cout entry. Rejected!\ n ; 287: } 288: } 289: 290: int PartsCatalog::Exists(int PartNumber) 291: { 292: int offset; 293: Find(offset,PartNumber); 294: return offset; 295: } 296: 297: Part . PartsCatalog::Get(int PartNumber) 298: { 299; int offset; 300: return (Find(offset, PartNumber)); 301: 302: } 303: 304: int mainO 305: { 306: PartsCatalog pc; 307: Part pPart = 0; 308: int PartNumber; 309; int value; 310: int choice; 311: 312: while (1) 313: { 314: cout (O)Ouit (1)Car (2)Plane: ; 315: cin choice; 316: 317: if (!choice) 318: break; 319: 320: cout New PartNumber?; ; 321: cin PartNumber; 322: 323: if (choice == 1) 324: { 325: cout Model Year?: ; 326: cin value; 327: pPart = new CarPart(value.PartNumber); 328: ) 329: else 330: { 331: cout Engine Number?: ; 332 333 334 335 336 337 338 339 cin value; pPart = new AirPlanePart(value,PartNumber); pc.Insert(pPart); pc, ShowAllO; return 0; (O)Quit (l)Car (2)Plane; 1 New PartNumber?: 1234 Model Year?: 94 (O)Quit (1)Car (2)Plane: 1 New PartNumber?: 4434 Model Year?: 93 (O)Quit (1)Car (2)Plane: 1 New PartNumber?: 1234 Model Year?: 94 1234 was the first entry. Rejected! (O)Quit (l)Car (2)Plane: 1 New PartNumber?: 2345 Model Year?: 93 (O)Quit (1)Car (2)Plane: 0 Part Number; 1234 Model Year; 94 Part Number: 2345 Model Year; 93 Part Number; 4434 Model Year: 93 В строке 82 класс PartsList объявляется другом класса PartNode. В данном случае объявление класса другом происходит в разделе public объявления класса PartNode, но так поступать вовсе не обязательно. Это объявление можно размещать в любом месте объявления класса, что не изменит его суть. В результате объявления класса как друга все закрытые методы и переменные-члены класса PartNode становятся доступными любой функции-члену класса PartsList. В строке 160 были внесены изменения в вызове функции-члена GetFirstO с учетом появившихся новых возможностей. Теперь вместо возвращения pHead->GetPart эта функция может возвращать закрытую переменную-член pHead->itsPart. Аналогичным образом в функции InsertO можно написать pNode->itsNext = pHead вместо переменной-члена pHead->SetNext(pHead). В данном случае внесенные изменения существенно не улучшили код профаммы, поэтому нет особых причин делать класс PartsList другом PartNode. В данном примере просто хотелось проиллюстрировать, как работает ключевое слово friend. Объявление классов-друзей следует применять с осторожностью. Класс объявляется как друг какого-либо иного класса в том случае, когда два класса тесно взаимодей-
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |