#include
#include
#include
#include
#include
#include "food.h"
#include "io_lib.h"
#include "menu.h"
using namespace std;
// 点餐菜单
PurchaseMenu g_purchase_menu;
// 管理员账户
Administrator g_administrator("temp");
char **data = NULL;
void Init()
{
data = IoTool::Read("data.txt");
int data_pos = 0;
vector<Single> single_list;
vector<Many> many_list;
while (data[data_pos] != NULL) {
char *line = data[data_pos++];
string str_line(line);
istringstream strin(str_line);
string type;
strin >> type;
if (type == "single") {
string name;
int price;
strin >> name >> price;
single_list.push_back(Single(name, price));
}
if (type == "many") {
string name;
int price;
strin >> name >> price;
string tmp_name;
int tmp_price;
vector<Single> many_single_list;
while (strin >> tmp_name >> tmp_price) {
many_single_list.push_back(Single(tmp_name, tmp_price));
}
many_list.push_back(Many(name, price, many_single_list));
}
if (type == "password") {
string password;
strin >> password;
g_administrator = Administrator(password);
}
}
g_purchase_menu.set_single_list(single_list);
g_purchase_menu.set_many_list(many_list);
}
void MyExit()
{
// 修改
string new_pass("password ");
new_pass = new_pass + g_administrator.password() + string("\n");
strcpy(data[0], new_pass.c_str());
int data_pos = 0;
string out_data;
while (data[data_pos] != NULL) {
char *line = data[data_pos++];
out_data += string(line);
}
IoTool::Write("data.txt", out_data.c_str(), true);
// 写入订单信息
string out_order;
vector<Order> order_list_ = g_administrator.order_list();
for (auto tmp_order : order_list_) {
out_order = out_order + tmp_order.name() + string(" ");
for (auto tmp_single : tmp_order.single_list()) {
out_order = out_order + tmp_single.name() + string(" ");
}
for (auto tmp_many : tmp_order.many_list()) {
out_order = out_order + tmp_many.name() + string(" ");
}
out_order = out_order + string("\n");
}
IoTool::Write("order.txt", out_order.c_str(), false);
}
int main(int argc, char *argv[])
{
Init();
cout << "初始化完成" << endl;
while (1) {
cout << endl;
system("pause");
system("cls");
cout << "1.顾客点餐" << endl
<< "2.管理员操作" << endl
<< "请输入选择:";
int choice = 0;
cin >> choice;
switch (choice) {
Change: case 1: {
g_purchase_menu.RunPurchase();
PayMenu p(g_purchase_menu);
char pay_result = p.RunPay();
if (pay_result == 'Y') {
time_t t = time(0);
char tmp[64];
strftime(tmp, sizeof(tmp), "%Y-%m-%d-%H-%M-%S", localtime(&t));
Order o(p.sum_price(), string(tmp), p.single_list(), p.many_list());
o.ShowOrder();
g_administrator.push_order(o);
}
else if (pay_result == 'N') {
goto Change;
}
else {
break;
}
break;
}
case 2: {
cout << "请输入登录密码:";
string password;
cin >> password;
if (g_administrator.is_Pass(password)) {
g_administrator.Run();
}
else {
cout << "密码错误" << endl;
}
break;
}
}
}
return 0;
}
#ifndef FOOD_H
#define FOOD_H
#include
#include
#include
using std::cout;
using std::endl;
using std::string;
using std::vector;
// 基类,定义了食物的基本属性,包括名字价格,并定义了这些属性的存取操作
class Basic
{
public:
Basic() {}
Basic(string name, int price) : name_(name), price_(price) {}
// 输出,信息
void Show() {
cout << "名称:" << name_ << ",价格:" << price_ << endl;
}
string name() { return name_; }
int price() { return price_; }
void set_name(string name) { name_ = name; }
void set_price(int price) { price_ = price; }
private:
string name_;
int price_;
};
// 单品类,完全继承自基类
class Single : public Basic
{
public:
Single() {}
Single(string name, int price) : Basic(name, price) {}
};
// 套餐,继承自基类,并且多了套餐中各种食物的详细情况
class Many : public Basic
{
public:
Many() {}
Many(string name, int price, const vector &list) : Basic(name, price), list_(list) {}
// 输出,列表
void ShowList() {
cout << " 具体信息如下:" << endl;
for (int i=0; i<list_.size(); i++) {
cout << " ";
list_[i].Show();
}
}
vector<Single> list() { return list_; }
void set_list(const vector<Single> &list) { list_ = list; }
private:
vector list_;
};
#endif
直接点中断按钮,打开编译器会停止在出错的代码位置,查看调用堆栈等,应该是非法指针
如果你是要做网页,建议重新搜个资源,你这个是控制台程序,并没有界面。(ASP.NET的源码)
如果你是做客户端,请找MFC的资源。
这个错绝对是指针的问题,你可以先初始化一下指针,还不行的话就一点点屏蔽用到指针的代码,看是哪一句断的