⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch15.htm

📁 一本好的VC学习书,本人就是使用这本书开始学习的vc,希望能对大家有帮助
💻 HTM
📖 第 1 页 / 共 5 页
字号:
3:      typedef unsigned short USHORT;4:    5:    6:      // **************** Part ************7:    8:      // Abstract base class of parts9:      class Part10:      {11:      public:12:         Part():itsPartNumber(1) {}13:         Part(ULONG PartNumber):14:             itsPartNumber(PartNumber){}15:         virtual ~Part(){}16:         ULONG GetPartNumber() const 17:             { return itsPartNumber; }18:         virtual void Display() const =0; 19:      private:20:         ULONG itsPartNumber;21:      };22:    23:      // implementation of pure virtual function so that24:      // derived classes can chain up25:      void Part::Display() const26:      {27:          cout &lt;&lt; &quot;\nPart Number: &quot; &lt;&lt; itsPartNumber &lt;&lt; endl;28:      }29:    30:      // **************** Car Part ************31:    32:      class CarPart : public Part33:      {34:      public:35:         CarPart():itsModelYear(94){}36:         CarPart(USHORT year, ULONG partNumber);37:         virtual void Display() const 38:         { 39:             Part::Display(); 40:             cout &lt;&lt; &quot;Model Year: &quot;;41:             cout &lt;&lt; itsModelYear &lt;&lt; endl;  42:         }43:      private:44:         USHORT itsModelYear;45:      };46:    47:      CarPart::CarPart(USHORT year, ULONG partNumber):48:         itsModelYear(year),49:         Part(partNumber)50:      {}51:    52:    53:      // **************** AirPlane Part ************54:    55:      class AirPlanePart : public Part56:      {57:      public:58:         AirPlanePart():itsEngineNumber(1){};59:         AirPlanePart60:             (USHORT EngineNumber, ULONG PartNumber);61:         virtual void Display() const62:         { 63:             Part::Display(); 64:             cout &lt;&lt; &quot;Engine No.: &quot;;65:             cout &lt;&lt; itsEngineNumber &lt;&lt; endl;  66:         }67:      private:68:         USHORT itsEngineNumber;69:      };70:    71:      AirPlanePart::AirPlanePart72:          (USHORT EngineNumber, ULONG PartNumber):73:         itsEngineNumber(EngineNumber),74:         Part(PartNumber)75:      {}76:    77:      // **************** Part Node ************78:      class PartNode79:      {80:      public:81:         PartNode (Part*);82:         ~PartNode();83:         void SetNext(PartNode * node) 84:            { itsNext = node; }85:         PartNode * GetNext() const;86:         Part * GetPart() const;87:      private:88:         Part *itsPart;89:         PartNode * itsNext;90:      };91:       // PartNode Implementations...92:    93:       PartNode::PartNode(Part* pPart):94:       itsPart(pPart),95:       itsNext(0)96:       {}97:    98:       PartNode::~PartNode()99:       {100:          delete itsPart;101:          itsPart = 0;102:          delete itsNext;103:          itsNext = 0;104:       }105:    106:       // Returns NULL if no next PartNode107:       PartNode * PartNode::GetNext() const108:       {109:             return itsNext;110:       }111:    112:       Part * PartNode::GetPart() const113:       {114:          if (itsPart)115:             return itsPart;116:          else117:             return NULL; //error118:       }119:    120:    121:    122:      // **************** Part List ************123:      class PartsList124:      {125:      public:126:         PartsList();127:         ~PartsList();128:         // needs copy constructor and operator equals!129:         void     Iterate(void (Part::*f)()const) const;130:         Part*    Find(ULONG &amp; position, ULONG PartNumber)  const;131:         Part*    GetFirst() const;132:         void     Insert(Part *);133:         Part*    operator[](ULONG) const;134:         ULONG    GetCount() const { return itsCount; }135:         static    PartsList&amp; GetGlobalPartsList() 136:         { 137:             return  GlobalPartsList; 138:         }139:      private:140:         PartNode * pHead;141:         ULONG itsCount;142:         static PartsList GlobalPartsList;143:      };144:    145:      PartsList PartsList::GlobalPartsList;146:    147: 148:       PartsList::PartsList():149:          pHead(0),150:          itsCount(0)151:          {}152:    153:       PartsList::~PartsList()154:       {155:          delete pHead;156:       }157:    158:       Part*   PartsList::GetFirst() const159:       {160:          if (pHead)161:             return pHead-&gt;GetPart();162:          else163:             return NULL;  // error catch here164:       }165:    166:       Part *  PartsList::operator[](ULONG offSet) const167:       {168:          PartNode* pNode = pHead;169:    170:          if (!pHead)171:             return NULL; // error catch here172:    173:          if (offSet &gt; itsCount)174:             return NULL; // error175:    176:          for (ULONG i=0;i&lt;offSet; i++)177:             pNode = pNode-&gt;GetNext();178:    179:         return   pNode-&gt;GetPart();180:       }181:    182:       Part*   PartsList::Find(183:           ULONG &amp; position, 184:           ULONG PartNumber)  const185:       {186:          PartNode * pNode = 0;187:          for (pNode = pHead, position = 0;188:                pNode!=NULL;189:                pNode = pNode-&gt;GetNext(), position++)190:          {191:             if (pNode-&gt;GetPart()-&gt;GetPartNumber() == PartNumber)192:                break;193:          }194:          if (pNode == NULL)195:             return NULL;196:          else197:             return pNode-&gt;GetPart();198:       }199:    200:       void PartsList::Iterate(void (Part::*func)()const) const201:       {202:          if (!pHead)203:             return;204:          PartNode* pNode = pHead;205:          do206:             (pNode-&gt;GetPart()-&gt;*func)();207:          while (pNode = pNode-&gt;GetNext());208:       }209:    210:       void PartsList::Insert(Part* pPart)211:       {212:          PartNode * pNode = new PartNode(pPart);213:          PartNode * pCurrent = pHead;214:          PartNode * pNext = 0;215:    216:          ULONG New =  pPart-&gt;GetPartNumber();217:          ULONG Next = 0;218:          itsCount++;219:    220:          if (!pHead)221:          {222:             pHead = pNode;223:             return;224:          }225:    226:          // if this one is smaller than head227:          // this one is the new head228:          if (pHead-&gt;GetPart()-&gt;GetPartNumber() &gt; New)229:          {230:             pNode-&gt;SetNext(pHead);231:             pHead = pNode;232:             return;233:          }234:    235:          for (;;)236:          {237:             // if there is no next, append this new one238:             if (!pCurrent-&gt;GetNext())239:             {240:                pCurrent-&gt;SetNext(pNode);241:                return;242:             }243: 244:             // if this goes after this one and before the next245:             // then insert it here, otherwise get the next246:             pNext = pCurrent-&gt;GetNext();247:             Next = pNext-&gt;GetPart()-&gt;GetPartNumber();248:             if (Next &gt; New)249:             {250:                pCurrent-&gt;SetNext(pNode);251:                pNode-&gt;SetNext(pNext);252:                return;253:             }254:             pCurrent = pNext;255:          }256:       }257:    258:    259:    260:      class PartsCatalog261:      {262:      public:263:         void Insert(Part *);264:         ULONG Exists(ULONG PartNumber);265:         Part * Get(int PartNumber);266:         operator+(const PartsCatalog &amp;);267:         void ShowAll() { thePartsList.Iterate(Part::Display); }268:      private:269:         PartsList thePartsList;270:      };271:    272:      void PartsCatalog::Insert(Part * newPart)273:      {274:         ULONG partNumber =  newPart-&gt;GetPartNumber();275:         ULONG offset;276:    277:         if (!thePartsList.Find(offset, partNumber))278:    279:            thePartsList.Insert(newPart);280:         else281:         {282:            cout &lt;&lt; partNumber &lt;&lt; &quot; was the &quot;;283:            switch (offset)284:            {285:               case 0:  cout &lt;&lt; &quot;first &quot;; break;286:               case 1:  cout &lt;&lt; &quot;second &quot;; break;287:               case 2:  cout &lt;&lt; &quot;third &quot;; break;288:               default: cout &lt;&lt; offset+1 &lt;&lt; &quot;th &quot;;289:            }290:            cout &lt;&lt; &quot;entry. Rejected!\n&quot;;291:         }292:      }293:    294:      ULONG PartsCatalog::Exists(ULONG PartNumber)295:      {296:         ULONG offset;297:         thePartsList.Find(offset,PartNumber);298:            return offset;299:      }300:    301:      Part * PartsCatalog::Get(int PartNumber)302:      {303:         ULONG offset;304:         Part * thePart = thePartsList.Find(offset, PartNumber);305:         return thePart;306:      }307:    308:    309:      int main()310:      {311:         PartsCatalog pc;312:         Part * pPart = 0;313:         ULONG PartNumber;314:         USHORT value;315:         ULONG choice;316: 317:         while (1)318:         {319:            cout &lt;&lt; &quot;(0)Quit (1)Car (2)Plane: &quot;;320:            cin &gt;&gt; choice;321:    322:            if (!choice)323:               break;324:    325:            cout &lt;&lt; &quot;New PartNumber?: &quot;;326:            cin &gt;&gt;  PartNumber;327:    328:            if (choice == 1)329:            {330:               cout &lt;&lt; &quot;Model Year?: &quot;;331:               cin &gt;&gt; value;332:               pPart = new CarPart(value,PartNumber);333:            }334:            else335:            {336:               cout &lt;&lt; &quot;Engine Number?: &quot;;337:               cin &gt;&gt; value;338:               pPart = new AirPlanePart(value,PartNumber);339:            }340:            pc.Insert(pPart);341:         }342:         pc.ShowAll();343:        return 0;<TT>344: }</TT></FONT>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -