📄 ch14rv2.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"><HTML><HEAD><!-- This document was created from RTF source by rtftohtml version 3.0.1 --> <META NAME="GENERATOR" Content="Symantec Visual Page 1.0"> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=iso-8859-1"> <TITLE>Teach Yourself C++ in 21 Days</TITLE></HEAD><BODY TEXT="#000000" BGCOLOR="#FFFFFF"><H1></H1><P ALIGN="CENTER"><A HREF="ch14.htm"><IMG SRC="../buttons/BLANPREV.GIF"WIDTH="37" HEIGHT="37" ALIGN="BOTTOM" BORDER="0"></A><A HREF="http://www.mcp.com/sams"><IMGSRC="../buttons/BLANHOME.GIF" WIDTH="37" HEIGHT="37" ALIGN="BOTTOM"BORDER="0"></A><A HREF="../index.htm"><IMG SRC="../buttons/BLANTOC.GIF"WIDTH="37" HEIGHT="37" ALIGN="BOTTOM" BORDER="0"></A><A HREF="ch15.htm"><IMG SRC="../buttons/BLANNEXT.GIF"WIDTH="37" HEIGHT="37" ALIGN="BOTTOM" BORDER="0"></A><H2 ALIGN="CENTER"><BR><A NAME="Heading1"></A><FONT COLOR="#000077">In Review</FONT></H2><P>The Week in Review program for Week 2 brings together many of the skills you'veacquired over the past fortnight and produces a powerful program.</P><P>This demonstration of linked lists utilizes virtual functions, pure virtual functions,function overriding, polymorphism, public inheritance, function overloading, foreverloops, pointers, references, and more.</P><P>The goal of this program is to create a linked list. The nodes on the list aredesigned to hold parts, as might be used in a factory. While this is not the finalform of this program, it does make a good demonstration of a fairly advanced datastructure. The code list is 311 lines. Try to analyze the code on your own beforereading the analysis that follows the output.</P><P><A NAME="Heading2"></A><FONT SIZE="4" COLOR="#000077"><B>Listing R2.1. Week 2in Review listing.</B></FONT><PRE><FONT COLOR="#0066FF">0: // **************************************************1: //2: // Title: Week 2 in Review3: //4: // File: Week25: //6: // Description: Provide a linked list demonstration program7: //8: // Classes: PART - holds part numbers and potentially other9: // information about parts10: //11: // PartNode - acts as a node in a PartsList12: //13: // PartsList - provides the mechanisms for a linked list Âof parts14: //15: // Author: Jesse Liberty (jl)16: //17: // Developed: 486/66 32mb RAM MVC 1.518: //19: // Target: Platform independent20: //21: // Rev History: 9/94 - First release (jl)22: //23: // **************************************************24: 25: #include <iostream.h>26: 27: typedef unsigned long ULONG;28: typedef unsigned short USHORT;29: 30: 31: // **************** Part ************32: 33: // Abstract base class of parts34: class Part35: {36: public:37: Part():itsPartNumber(1) {}38: Part(ULONG PartNumber):itsPartNumber(PartNumber){}39: virtual ~Part(){};40: ULONG GetPartNumber() const { return itsPartNumber; }41: virtual void Display() const =0; // must be overridden42: private:43: ULONG itsPartNumber;44: };45: 46: // implementation of pure virtual function so that47: // derived classes can chain up48: void Part::Display() const49: {50: cout << "\nPart Number: " << itsPartNumber << endl;51: }52: 53: // **************** Car Part ************54: 55: class CarPart : public Part56: {57: public:58: CarPart():itsModelYear(94){}59: CarPart(USHORT year, ULONG partNumber);60: virtual void Display() const 61: { 62: Part::Display(); cout << "Model Year: ";63: cout << itsModelYear << endl; 64: }65: private:66: USHORT itsModelYear;67: };68: 69: CarPart::CarPart(USHORT year, ULONG partNumber):70: itsModelYear(year),71: Part(partNumber)72: {}73: 74: 75: // **************** AirPlane Part ************76: 77: class AirPlanePart : public Part78: {79: public:80: AirPlanePart():itsEngineNumber(1){};81: AirPlanePart(USHORT EngineNumber, ULONG PartNumber);82: virtual void Display() const83: { 84: Part::Display(); cout << "Engine No.: ";85: cout << itsEngineNumber << endl; 86: }87: private:88: USHORT itsEngineNumber;89: };90: 91: AirPlanePart::AirPlanePart(USHORT EngineNumber, ULONG PartNumber):92: itsEngineNumber(EngineNumber),93: Part(PartNumber)94: {}95: 96: // **************** Part Node ************97: class PartNode98: {99: public:100: PartNode (Part*);101: ~PartNode();102: void SetNext(PartNode * node) { itsNext = node; }103: PartNode * GetNext() const;104: Part * GetPart() const;105: private:106: Part *itsPart;107: PartNode * itsNext;108: };109: 110: // PartNode Implementations...111: 112: PartNode::PartNode(Part* pPart):113: itsPart(pPart),114: itsNext(0)115: {}116: 117: PartNode::~PartNode()118: {119: delete itsPart;120: itsPart = 0;121: delete itsNext;122: itsNext = 0;123: }124: 125: // Returns NULL if no next PartNode126: PartNode * PartNode::GetNext() const127: {128: return itsNext;129: }130: 131: Part * PartNode::GetPart() const132: {133: if (itsPart)134: return itsPart;135: else136: return NULL; //error137: }138: 139: // **************** Part List ************140: class PartsList141: {142: public:143: PartsList();144: ~PartsList();145: // needs copy constructor and operator equals!146: Part* Find(ULONG & position, ULONG PartNumber) const;147: ULONG GetCount() const { return itsCount; }148: Part* GetFirst() const;149: static PartsList& GetGlobalPartsList() 150: { 151: return GlobalPartsList; 152: }153: void Insert(Part *);154: void Iterate(void (Part::*f)()const) const;155: Part* operator[](ULONG) const;156: private:157: PartNode * pHead;158: ULONG itsCount;159: static PartsList GlobalPartsList;160: };161: 162: PartsList PartsList::GlobalPartsList;163: 164: // Implementations for Lists...165: 166: PartsList::PartsList():167: pHead(0),168: itsCount(0)169: {}170: 171: PartsList::~PartsList()172: {173: delete pHead;174: }175: 176: Part* PartsList::GetFirst() const177: {178: if (pHead)179: return pHead->GetPart();180: else181: return NULL; // error catch here182: }183: 184: Part * PartsList::operator[](ULONG offSet) const185: {186: PartNode* pNode = pHead;187: 188: if (!pHead)189: return NULL; // error catch here190: 191: if (offSet > itsCount)192: return NULL; // error193: 194: for (ULONG i=0;i<offSet; i++)195: pNode = pNode->GetNext();196: 197: return pNode->GetPart();198: }199: 200: Part* PartsList::Find(ULONG & position, ULONG PartNumber) const201: {202: PartNode * pNode = 0;203: for (pNode = pHead, position = 0;204: pNode!=NULL;205: pNode = pNode->GetNext(), position++)206: {207: if (pNode->GetPart()->GetPartNumber() == PartNumber)208: break;209: }210: if (pNode == NULL)211: return NULL;212: else213: return pNode->GetPart();214: }215: 216: void PartsList::Iterate(void (Part::*func)()const) const217: {218: if (!pHead)219: return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -