2016-03-12 1 views
1

Мое задание - создать программу для управления деятельностью ресторана, которая включает в себя функцию репликации пользователя и многие другие функции. Я должен отправить это задание только в 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

Вы не можете вызвать производные классы статической функции таким образом. Дизайн странный BTW. –

ответ

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

Определить эту функцию

static void execute(){ 
    switch (user_input){ 
    case 0: 
     break; 
    default: 
     Customer::menu(); 
     break; 

    } 

}; 

после определения класса Customer.

Примите во внимание, что объявление локальной переменной input в функции ниже

static void menu(){ 
    int input; 
    print(); 
    setInput(input); 
    execute(); 
} 

не имеет смысла, так как эта переменная не используется в функции.

Смежные вопросы