看到这样一样题,想想就简单的写了写自测一下,还是有很多收获。
需求:
1.模拟银行,客户关系封装类;
2.客户到银行办理业务需先排队;
3.银行根据队列处理业务,优选选择金卡客户;
4.办理建卡、存款、取钱、销户业务。
代码思路:
1.定义银行类,客户类,队列类;
2.思考现实实例,银行、队列只能有一个实例,客户可以有多个实例
3.理清类关系,银行依赖于队列决定客户,银行依赖客户数据处理业务,队列依赖客户排队
4.确定主导类为银行类,主要的业务逻辑在银行
Debug收获:
1.前向声明的类,只能用它的成员指针(之前没有注意这个问题)
2.对象传递尽量用指针,如果用返回值传递只能用堆内存
需要优化问题:
1.类的private封装,账户数据结构过于简单
2.银行客户账户数据存储用的是数组,可以用STL
3.银行账号,直接累加,可随机,要确保唯一
4.代码清晰易读,代码业务流程简化
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
//常量宏
#define QUEUE_LONGTH_MAX 50
#define CARD_SUM_MAX 10000
#define GOLDEN_SUM_LIMIT 888
#define ILLEGAL_VALUE 0xffff
//日志宏
#define log_info(...) do {\
printf("<%s %s> %s %s:%d INFO:",__DATE__, __TIME__,__FUNCTION__,__FILE__,__LINE__)&&\
printf(__VA_ARGS__)&&\
printf("\n");\
}while(0)
//类声明
class CserviceQueue;
class Cbank;
class Ccustomer;
class CserviceQueue;
enum CARDTYPE
{
OrdinaryCard, //普卡
GoldenCard //金卡
};
//业务种类
enum SERVICE
{
registerCard,
deposite,
query,
withdraw,
cancelCard
};
//银行账户
struct sbankCustomerAccount
{
int card_Number;
int id_Customer;
char* name;
int moneySum;
int cardType;
};
//客户卡信息
struct sCard
{
int card_Number;
int cardType;
};
//排队队列节点
struct sRegisterNode
{
int num;
Ccustomer *customer;
sRegisterNode *next;
};
//客户类
class Ccustomer
{
public:
Ccustomer():queueNo(0),customerBankCard(NULL)
{
}
//需要处理业务信息
void my_service(int id, char* name, int money, SERVICE ser)
{
customer_id = id;
customer_name = name;
customer_money = money;
service = ser;
}
//delete掉自己的卡, customerBankCard在Cbank类中new
void destoryCard()
{
delete customerBankCard;
customerBankCard = NULL;
}
~Ccustomer()
{
if(NULL!=customerBankCard)
{
delete customerBankCard;
customerBankCard = NULL;
}
}
int customer_id;
char * customer_name;
int customer_money;
SERVICE service;
sCard *customerBankCard;
int queueNo;
};
//排号队列类
class CserviceQueue
{
public:
CserviceQueue():dealNumber(0),totalNumber(0)
{
head = tail = NULL;
}
//排队
int registerQueue(Ccustomer *customer)
{
if(totalNumb