#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");
}
运行结果:
![](https://video.ask-data.xyz/img.php?b=https://iknow-pic.cdn.bcebos.com/5243fbf2b21193131ea564d26c380cd790238dea?x-bce-process=image%2Fresize%2Cm_lfit%2Cw_600%2Ch_800%2Climit_1%2Fquality%2Cq_85%2Fformat%2Cf_auto)