我的任务是创建一个程序来管理餐馆的活动,其中包括用户重新调整功能和许多其他功能。我需要仅在1 .cpp文件中提交此作业,因此我尝试将代码压缩为仅1档案:D。以下是我到目前为止在创建用户界面方面所做的工作:
#include <iostream>
using namespace std;
class UserInterface{
public:
typedef UserInterface super;
static int user_input;
static void menu(){
int input;
print();
setInput(input);
execute();
}
static void print(){
cout << "Welcome to the Restaurant Managing program!" << endl;
cout << "Please enter your ID. The ID of chef is 0 and the ID of customers is a positive integer: ";
};
static bool setInput(int input){
cin >> input;
if (input >= 0){
user_input = input;
return true;
}
else{
cout << "Invalid input!" << endl;
return false;
}
};
static void execute(){
switch (user_input){
case 0:
break;
default:
Customer::menu();
break;
}
};
};
class Customer :public UserInterface{
public:
static void print(){
cout << "1.Exit" << endl << "2.Make an order" << endl << "3.View orders" << endl << "4.Change order" << endl;
cout << "Please enter your ID: ";
}
static bool setInput(int input){
cin >> input;
if (input >= 1 && input <= 4){
user_input = input;
return true;
}
else{
cout << "Invalid input!" << endl;
return false;
}
};
static void exit(){
super::menu();
};
static void makeOrder(){};
static void viewOrder(){};
static void changeOrder(){};
static void execute(){
switch (user_input){
case 1:
exit();
break;
}
};
};
int UserInterface::user_input;
int main(){
int input;
UserInterface::menu();
system("pause");
}
问题在于,当我编译此代码时,我收到此错误:
Error 1 error C2653: 'Customer' : is not a class or namespace name
有人可以告诉我这里我做错了什么,我还能做些什么来改进我的代码?
答案 0 :(得分:2)
当您尝试调用Customer::menu();
时,编译器尚未看到Customer
类。这正是错误消息所说的:“客户不是类或命名空间名称。”
即使它知道Customer
是一个类的名称,它也不会知道它是否真的具有menu()
成员函数。它还不知道Customer
派生自UserInterface
并继承menu
函数。
一种解决方案是将UserInterface::execute
拆分为声明,可以在定义Customer
之前,以及定义,可以在之后定义Customer
:
class UserInterface { // start definition of UserInterface class
// ...
static void execute(); // declaration of execute() function
}; // end definition of UserInterface class
class Customer : public UserInterface { // start definition of Customer class
// ...
}; // end definition of Customer class
void UserInterface::execute() { // start definition of execute() function
switch (user_input){
case 0:
break;
default:
Customer::menu();
break;
}
}; // end definition of execute() function
另一个解决方案是在没有资格的情况下调用该函数:
static void execute(){
switch (user_input){
case 0:
break;
default:
menu();
break;
}
};
这取决于你真正想要达到的目标。也许您以后想要使menu
成为非静态函数并在派生类中覆盖它,然后您就不能再使用这个简单的解决方案了。
一般来说,我会说你应该重新考虑你的整个班级设计,因为它似乎不必要地复杂化。
P.S。:注意编译器警告:
warning C4101: 'input': unreferenced local variable
warning C4700: uninitialized local variable 'input' used
答案 1 :(得分:1)
定义此功能
static void execute(){
switch (user_input){
case 0:
break;
default:
Customer::menu();
break;
}
};
定义班级Customer
后。
考虑下面函数中的局部变量input
的声明
static void menu(){
int input;
print();
setInput(input);
execute();
}
没有意义,因为函数中没有使用此变量。