错误::不是类或命名空间名称

时间:2016-03-12 10:50:27

标签: c++

我的任务是创建一个程序来管理餐馆的活动,其中包括用户重新调整功能和许多其他功能。我需要仅在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  

有人可以告诉我这里我做错了什么,我还能做些什么来改进我的代码?

2 个答案:

答案 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();
}

没有意义,因为函数中没有使用此变量。