C++菜单程序case 'C'处'name'未在当前作用域声明报错排查
错误诱因
报错核心是C++的局部变量作用域限制:
- 你定义的三个并行数组
name、surname、hoursWorked是main()函数内的局部变量,仅能在main()的大括号范围内被访问。 - 你在独立的
menuDisplay()函数的case 'C'分支里直接使用这三个变量,但menuDisplay()既没有定义这三个变量,也没有把它们设为入参接收,编译器在当前函数作用域找不到对应变量声明,就会抛出该错误。
另外现有代码还有两处逻辑问题:
main()里调用完menuDisplay()后,无条件直接调用了一次getEmpDetails(),不管用户菜单选什么,程序启动后都会强制要求录入10条员工信息,不符合菜单交互的设计。- do-while循环判断条件写反了:当前逻辑是输入C/L/A/S/E这些合法选项就一直循环,输入非法值才退出,还把无效选择提示放在了循环外面,完全不符合正常菜单的交互逻辑。
修复方法
- 第一步:修改
menuDisplay的函数声明和实现,增加三个数组入参,让函数可以接收外部传入的员工数组。
原函数声明:
修改为:void menuDisplay();
同步把void menuDisplay(string name[], string surname[], int hoursWorked[]);menuDisplay函数实现的头部改成和声明一致的参数列表。 - 第二步:调整
main()函数逻辑,删掉main里多余的提前调用getEmpDetails()的语句,调用菜单时把三个数组作为参数传入即可,修改后的main核心代码:int main() { // 并行数组声明保持原有逻辑不变 string name[10]; string surname[10]; int hoursWorked[10]; // 传入数组调用菜单,移除原有多余的getEmpDetails调用 menuDisplay(name, surname, hoursWorked); return 0; } - 第三步:修正do-while循环逻辑,把无效输入提示放到循环内,调整循环终止条件为用户输入'E'时退出,修正后的menuDisplay核心逻辑:
void menuDisplay(string name[], string surname[], int hoursWorked[]){ char choice; do{ cout << "[C]apture Employee details" << endl; cout << "[L]ist Employee details" << endl; cout << "[A]ll Employee Payslips" << endl; cout << "[S]ingle Employee Payslips" << endl; cout << "[E]xit" << endl; cin >> choice; switch(choice){ case 'C': cout << "capture employee details" << endl; getEmpDetails(name, surname, hoursWorked); break; case 'L': cout << "list employee details" << endl; break; case 'A': cout << "All Employee Payslips" << endl; break; case 'S': cout <<"Single employee payslips" << endl; break; case 'E': cout << "Exit" << endl; break; default: cout << "invalid choice, please choose either C,L,A,S,E" <<endl; } }while(choice != 'E'); // 仅当输入E时退出菜单循环 }
注:原代码中提示语的"invaild"为拼写错误,正确拼写为invalid。
内容的提问来源于stack exchange,提问作者newtothis
相关产品推荐
相关产品推荐

