货物链表类+贫血模型+充血模型(C++)
- 问题背景
- 解决方案
- 总结
阅读之前注意:
本文阅读建议用时:20min
本文阅读结构如下表:
项目 | 下属项目 | 测试用例数量 |
---|---|---|
问题背景 | 无 | 0 |
解决方案 | 无 | 2 |
总结 | 无 | 0 |
问题背景
某商店经销一种货物,货物购进和卖出以箱为单位,各箱的重量不一样,因此商店需要记录目前库存的总重量,现在用C++模拟商店货物卖出和买进的情况。1
解决方案
思路:用一个链表来存储货物信息,初始时候头结点、尾巴节点都为空,买第一件货物时头、尾节点均指向第一件货物,之后再买进时,把新的货物信息挂上链表尾部,尾巴节点下移至新的货物;卖出时则从链表头部开始卖,卖出一件货物就把头结点下移,直至头结点为空表示全部卖出。(更多细节详见代码)
参考以下代码2:
//此版为贫血模型
#include"iostream"
using namespace std;
//相当于Java中的贫血模型,业务模型在全局函数里实现,类仅仅为业务框架做支撑,这样的类叫做消息类,做消息的载体
//反过来,当业务模型都在类里边实现的话,就是充血模型,这样的类即业务类
//通常来说会写成充血模型,但业务类中可能还有其他消息类
class goods{
public:
goods(int w){ weight = w; totalWeight += weight; }
~goods(){ totalWeight -= weight; }
static int getTotalWeight(){ return totalWeight; }
goods *next;
private:
int weight;
static int totalWeight;
};
void purchase(goods * &f,goods* &r,int w)
{
goods *p = new goods(w);//new会调用拷贝构造函数,默认是*p的next为NULL
if (f == NULL){
f = r = p;
}
else{
r->next = p;//挂链表
r = p;//当前尾巴节点下移
}
}
void sale(goods * &f)
{
if (f == NULL){
cout << "no any goods" << endl;
return;
}
goods *p = f;
f = f->next;
delete p;
}
int goods::totalWeight = 0;//静态成员变量初始化
void main()
{
goods *front = NULL, *rear = NULL;
int choice = 0;
int w = 0;
while (1)
{
cout << "Enter your choice:" << endl;
cout << "1 to purchase, 2 to sale" << endl;
cin >> choice;
switch (choice)
{
case 1:{
cout << "Enter the weight that you want to purchase:";
cin >> w;
purchase(front, rear, w);
cout << "Now, total weight is:" << goods::getTotalWeight() << endl;
break;
}
case 2:
{
sale(front);
cout << "Now, total weight is:" << goods::getTotalWeight() << endl;
break;
}
}
}
}
下面要实现的充血模型,仅仅是把业务函数搬进了类之中。
参考以下代码:
//此版为充血模型
#include"iostream"
using namespace std;
class goods{
public:
goods(int w){ weight = w; totalWeight += weight;}
~goods(){ totalWeight -= weight; }
static int getTotalWeight(){ return totalWeight; }
void purchase(goods * &f, goods * &r, int w)//仅仅把业务函数搬进类
{
goods *p = new goods(w);
if (f == NULL){
f = r = p;
}
else{
r->next = p;
r = p;
}
}
void sale(goods * &f)//仅仅把业务函数搬进类
{
if (f == NULL){
cout << "no any goods" << endl;
return;
}
goods *p = f;
f = f->next;
delete p;
}
private:
int weight;
static int totalWeight;
goods *next;
};
int goods::totalWeight = 0;
void main()
{
goods *front = NULL, *rear = NULL;
goods shop1(0);
int choice = 0;
int w = 0;
while (1)
{
cout << "Enter your choice:" << endl;
cout << "1 to purchase, 2 to sale" << endl;
cin >> choice;
switch (choice)
{
case 1:{
cout << "Enter the weight that you want to purchase:";
cin >> w;
shop1.purchase(front, rear, w);
cout << "Now, total weight is:" << goods::getTotalWeight() << endl;
break;
}
case 2:
{
shop1.sale(front);
cout << "Now, total weight is:" << goods::getTotalWeight() << endl;
break;
}
}
}
}
总结
如果我们对类的存储机制了解过的话(不了解的话可以参考这篇文章:从内存四区的角度来理解C++中的类 )。稍加思考就会发现,这个货物链表类其实和C语言中的结构体链表是一样的。
如果本文对你有帮助,不如请我一罐可乐吧 🍼