C++程序设计

设计一个仓库类
(1)私有成员为,仓库名称,仓库中物品(名称,数量,单价),采用指针存储动态数组方式存储物品信息。
(2)重载“+”操作,表示两个仓库合并,仓库名称由两个仓库名称连接到一起,其中新仓库为为两个仓库的所有物品,且同一种物品能够合并。
(3)重载[]操作以获得第i个物品记录。
(4)该类的对象不能拷贝构造及赋值

#include <iostream>
#include <string>
#include <iomanip>
#include <assert.h>
using namespace std;
// 物品
struct Object
{
 Object() :m_strName(""), m_nCount(0), m_dPrice(0.0) {}
 string m_strName;        // 物品名称
 int m_nCount;            // 物品数量
 double m_dPrice;         // 物品价格
};
// 动态数组节点
struct ObjectNode
{
 ObjectNode() { m_pNext = 0; }
 Object m_stData;         // 节点物品信息
 ObjectNode *m_pNext;     // 下一节点指针
};
// 仓库类
class Storage
{
public:
 explicit Storage(const string &strName) :m_strName(strName), m_pObjects(0) {}
 ~Storage() { clear(); }
 // 获得仓库名
 const string& GetName() const { return m_strName; }
 // 新加入一个物品stObject,如果仓库中已存在该物品,则增加该物品数量
 void AddObject(const Object &stObject)
 {
  ObjectNode *pObjNode = new ObjectNode;
  pObjNode->m_stData = stObject;
  
  // 仓库的第一个物品
  if (0 == m_pObjects)
  {
   m_pObjects = pObjNode;
  }
  else
  {
   ObjectNode *pTail = m_pObjects;
   // 当前节点就是该物品,增加数量
   if (pTail->m_stData.m_strName == stObject.m_strName)
   {
    pTail->m_stData.m_nCount += stObject.m_nCount;
    return;
   }
   while (pTail->m_pNext != 0)
   {
    pTail = pTail->m_pNext;
    // 当前节点就是该物品,增加数量
    if (pTail->m_stData.m_strName == stObject.m_strName)
    {
     pTail->m_stData.m_nCount += stObject.m_nCount;
     return;
    }
   }
   // 将当前节点加入最后
   pTail->m_pNext = pObjNode;
  }
 }
 // 获取第i个物品
 Object operator[] (int nIndex) const
 {
  if (IsEmpty())
  {
   assert(false);
   return Object();
  }
  ObjectNode *pTemp = m_pObjects;
  int i = 0;
  for (; i < nIndex; i++)
  {
   if (0 == pTemp)
    break;
   pTemp = pTemp->m_pNext;
  }
  if (0 != pTemp)
   return pTemp->m_stData;
  assert(false);
  return Object();
 }
 // 合并仓库,因为仓库类不能拷贝赋值,所以只有返回指针了
 Storage* operator+ (const Storage &stOther) const
 {
  Storage *pMerage = new Storage(m_strName + stOther.m_strName);
  ObjectNode *pTemp = m_pObjects;
  // 加入当前仓库的物品
  while (0 != pTemp)
  {
   pMerage->AddObject(pTemp->m_stData);
   pTemp = pTemp->m_pNext;
  }
  // 加入Other仓库的物品
  pTemp = stOther.m_pObjects;
  while (0 != pTemp)
  {
   pMerage->AddObject(pTemp->m_stData);
   pTemp = pTemp->m_pNext;
  }
  return pMerage;
 }
 // 仓库是空的
 bool IsEmpty() const
 {
  return (0 == m_pObjects);
 }
 // 清空仓库物品
 void clear()
 {
  ObjectNode *pTemp = m_pObjects;
  while (0 != pTemp)
  {
   m_pObjects = pTemp->m_pNext;
   delete pTemp;
   pTemp = m_pObjects;
  }
 }
 // 输出所有商品
 void Print() const
 {
  if (IsEmpty())
  {
   cout << "Storage " << m_strName << " is empty." << endl;
   return;
  }
  cout << "Objects In Storage " << m_strName << ":" << endl;
  cout << setw(10) << "Object Name" << setw(10) << "Count" << setw(10) << "Price" << endl;
  ObjectNode *pTemp = m_pObjects;
  while (0 != pTemp)
  {
   cout << setw(10) << pTemp->m_stData.m_strName << setw(10) 
    << pTemp->m_stData.m_nCount << setw(10) << pTemp->m_stData.m_dPrice << endl;
   pTemp = pTemp->m_pNext;
  }
 }
private:
 // 私有化拷贝构造及赋值函数,使对象不能拷贝构造及赋值
 Storage(const Storage &stOther) {}
 Storage& operator= (const Storage &stOther) { return *this; }
private:
 string m_strName;              // 仓库名
 ObjectNode *m_pObjects;        // 仓库物品头节点指针
};
//////////////////////////////////////////////////////////////////////////
//// 以下为测试函数
// 创建一个水果仓库
void CreateFruitsStorage(Storage &stFruits)
{
 Object stObject;
 stObject.m_strName = "Apple";
 stObject.m_nCount = 3;
 stObject.m_dPrice = 4.5;
 stFruits.AddObject(stObject);
 stObject.m_strName = "Orange";
 stObject.m_nCount = 1;
 stObject.m_dPrice = 3.4;
 stFruits.AddObject(stObject);
 stObject.m_strName = "Pear";
 stObject.m_nCount = 6;
 stObject.m_dPrice = 23.0;
 stFruits.AddObject(stObject);
 stObject.m_strName = "Tomato";
 stObject.m_nCount = 76;
 stObject.m_dPrice = 7.4;
 stFruits.AddObject(stObject);
}
// 创建一个蔬菜仓库
void CreateVegetablesStorage(Storage &stVegetables)
{
 Object stObject;
 stObject.m_strName = "Cabbage";
 stObject.m_nCount = 12;
 stObject.m_dPrice = 0.5;
 stVegetables.AddObject(stObject);
 stObject.m_strName = "Eggplant";
 stObject.m_nCount = 23;
 stObject.m_dPrice = 5.4;
 stVegetables.AddObject(stObject);
 stObject.m_strName = "Tomato";
 stObject.m_nCount = 21;
 stObject.m_dPrice = 7.4;
 stVegetables.AddObject(stObject);
}
// 打印仓库里第nIndex个商品信息
void PrintNthObject(const Storage &stStorage, int nIndex)
{
 Object stTemp = stStorage[nIndex];
 cout << "the "<<nIndex<<"th object in "<<stStorage.GetName()<<" storage :" << endl;
 cout << "Name: " << stTemp.m_strName << "   Price:" << stTemp.m_dPrice << "   Count" << stTemp.m_nCount << endl;
}
void main()
{
 Storage stFruits("Fruits"), stVegetables("Vegetables");
 // 创建一个水果仓库
 CreateFruitsStorage(stFruits);
 // 输出水果仓库信息
 stFruits.Print();
 // 测试重载的[]
 PrintNthObject(stFruits, 2);
 cout << endl;
 
 CreateVegetablesStorage(stVegetables);
 stVegetables.Print();
 cout << endl;
 // 测试重载的+
 Storage *pMarge = stFruits + stVegetables;
 pMarge->Print();
 delete pMarge;
 system("pause");
}

运行结果:

温馨提示:答案为网友推荐,仅供参考
相似回答