货物链表类+贫血模型+充血模型(C++)

货物链表类+贫血模型+充血模型(C++)

996.icu LICENSE

  • 问题背景
  • 解决方案
  • 总结

阅读之前注意:

本文阅读建议用时: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语言中的结构体链表是一样的。

如果本文对你有帮助,不如请我一罐可乐吧 🍼

在这里插入图片描述


  1. 问题基于王保明先生的讲课内容. ↩︎

  2. 程序基于王保明先生的讲课内容. ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值