X64。刚刚学C++,不知道哪出错了,代码运行不下去,想知道哪里出错和应该去补哪方面的内容学;求指导,谢谢!
引发异常的地方已经标了注释,大概是106行。
(0x00007FF6EEDAA7EC 处(位于 staff management system.exe 中)引发的异常: 0xC0000005: 写入位置 0x0000000000000000 时发生访问冲突。)
#include<iostream>
using namespace std;
#include<string>
#include<fstream>
void showMenu()
{
cout << "欢迎使用职工管理系统" << endl
<< "0.退出管理程序" << endl
<< "1.增加职工信息" << endl
<< "2.显示职工信息" << endl
<< "3.删除职工信息" << endl
<< "4.查找职工信息" << endl
<< "5.按照编号排序" << endl
<< "6.清空所有文档" << endl;
}
class staff
{
public:
virtual void showdetail() = 0;
int m_num;
string m_name;
int m_post;
string m_duty;
};
class employee :public staff
{
public:
employee() {};
employee(int num, string name, int post)
{
this->m_num = num; this->m_name = name; this->m_post = post;
}
virtual void showdetail()
{
m_duty = "完成经理交代的任务";
cout << "编号:" << m_num << " 姓名:" << m_name << " 岗位:" << m_post << " 职责:" << m_duty << endl;
}
};
class manager :public staff
{
public:
manager() {};
manager(int num, string name, int post)
{
m_num = num; m_name = name; m_post = post;
}
virtual void showdetail()
{
m_duty = "完成老板交代的任务";
cout << "编号:" << m_num << " 姓名:" << m_name << " 岗位:" << m_post << " 职责:" << m_duty << endl;
}
};
class boss :public staff
{
public:
boss() {};
boss(int num, string name, int post)
{
m_num = num; m_name = name; m_post = post;
}
virtual void showdetail()
{
m_duty = "吃喝玩乐";
cout << "编号:" << m_num << " 姓名:" << m_name << " 岗位:" << m_post << " 职责:" << m_duty << endl;
}
};
class temptRec
{
public:
staff** staffTab;
int staffAmount = 0;
void addStaff()
{
while (1)
{
cout << "请输入员工编号" << endl;
int num;
cin >> num;
cout << "请输入员工姓名" << endl;
string name;
cin >> name;
flag2:
cout << "请输入员工岗位: 1-普通职工 2-经理 3-老板" << endl;
int post;
cin >> post;
staffAmount++;
staff* sta;
sta = NULL;
switch (post)
{
case 1: sta = new employee(num, name, post); break;
case 2: sta = new manager(num, name, post); break;
case 3: sta = new boss(num, name, post); break;
default:break;
}
if (post != 1 && post != 2 && post != 3)
{
cout << "输入有误,请重新输入" << endl;
goto flag2;
}
staffTab[staffAmount - 1] = sta;//这里引发异常0x00007FF61E2CA7EC 处(位于 staff management system.exe 中)引发的异常: 0xC0000005: 写入位置 0x0000000000000000 时发生访问冲突。
ofstream ofs;
ofs.open("address.txt", ios::out);
for (int i = 0; i < staffAmount; i++)
{
ofs << staffTab[i]->m_num << " " << staffTab[i]->m_name << " " << staffTab[i]->m_post << " "
<< staffTab[i]->m_duty << endl;
}
ofs.close();
delete sta;
flag1:
cout << "是否继续添加?0-退出 1-继续添加" << endl;
int a;
cin >> a;
if (a == 0) { break; }
else if (a != 1) {
cout << "输入错误,请重新输入" << endl;
goto flag1;
}
}
};
};
void showDetail()
{
ifstream ifs;
ifs.open("address.txt", ios::in);
employee emp;
ifs.read((char *)&emp,sizeof(emp));
cout << emp.m_num<<" "<<emp.m_name;
}
int main()
{
temptRec temp;
while (1)
{
showMenu();
int choose;
cin >> choose;
switch (choose)
{
case 0: break;
case 1:temp.addStaff(); break;
case 2:showDetail(); break;
default:break;
}
system("pause");
system("cls");
}
system("pause");
return 0;
}
小魔女参考了bing和GPT部分内容调写:
你可以尝试以下步骤来解决你的问题:
如果你的代码没有任何错误,那么你可以尝试更深入地学习C++,以更好地理解你的代码。你可以通过阅读书籍、参加在线课程或参加实体课程来学习C++。你还可以参加社区论坛,与其他C++程序员交流,以获得更多的帮助。
回答不易,记得采纳呀。
这段代码中的异常是由于使用了空指针来访问内存而导致的。具体来说,在temptRec类的addStaff()方法中,当创建一个新的staff对象时,如果用户输入的岗位不是1、2或3,则该方法将使用goto语句将控制流程跳转到一个标签flag2,以重新获取用户的输入。但是,如果在跳转回到flag2之后,再次尝试创建新的staff对象,则该方法将使用之前已经释放的内存空间,因此会引发异常。
解决该问题的方法是不使用goto语句来跳转控制流程。相反,你可以使用一个循环来获取用户的输入,直到用户输入有效的岗位。另外,也可以使用vector容器来管理staff对象的集合,而不是使用动态数组。这样可以更方便地管理对象的生命周期,并避免内存泄漏和空指针引用等问题。
不知道你这个问题是否已经解决, 如果还没有解决的话:如果需要使用动态数组,那么需要用new分配空间
修改代码:
staff** staffTab=new staff*;