2016-04-28 48 views
-4
#include <iostream> 
#include <string> 
#ifndef en 
#define en std::endl 
#endif 

using namespace std; 

int login() { 
    //Basic login program 
    login: 
    string correctPass = "Love"; 
    string attemptPass; 
    cout << "Please insert password" << en; 
    cin >> attemptPass; 
    if (attemptPass == correctPass) { 
     cout << "Access Granted" << en << en; 
    } else { 
     goto login; 
    } 
    return 0; 
} 

int main() { 
    // Everything below is main menu crap that I want to turn into a function that somehow allows goto statements 
    login(); 
    mainMenu: 
    cout << en << "MAIN MENU" << en << en << "Payroll" << en << "Employees" << en << en; 
    string mainMenuOption; 
    cin >> mainMenuOption; 
    if (mainMenuOption == "Payroll" || "payroll") { 
    goto payroll; } 
    else if (mainMenuOption == "Employees" || "employees") { 
    goto employees; } 
    else { 
    goto mainMenu; } 


    payroll: 
    cout << "Fish"; 
    return 0; 

    employees: 
    cout << "Eleven"; 
    return 0; 
} 

基本上,我想將main菜單中的主菜單部分變成一個以某種方式保存goto短語的函數。我該怎麼做呢?我的意思是,我明白goto和功能不能很好地協同工作,但是有沒有另一種方法至少可以接近?如何創建一個具有goto語句的主菜單功能?

+1

請不要在代碼中使用'goto'。可能有些情況需要它,但這不是其中之一。使用循環和函數代替'goto'。 – NathanOliver

+0

跳過非平凡初始值設定項或析構函數的Gotos是災難的祕訣。 –

+0

將'en'的定義更改爲'#define en'\ n'',除非您需要'std :: endl'的額外內容。 –

回答

4

通常的方法是寫一個main_menu函數獲取輸入,並返回一個值,指示什麼選擇:

enum choice { payroll, employees, quit }; 

choice main_menu() { 
    /* whatever */ 
    return users_choice; 
} 

int main() { 
    bool done = false; 
    while (!done) { 
     switch(main_menu()) { 
      case payroll: do_payroll(); break; 
      case employees: do_employees(); break; 
      case quit: done = true; break; 
     } 
    } 
    return 0; 
} 

而且,擺脫了gotologin功能(以及類似在菜單的東西),只需使用一個循環:

void login() { 
    string correctPass = "Love"; 
    string attemptPass; 
    while (attemptPass != correctPass) { 
     /* whatever */ 
    } 
} 

(我也改變了login()返回類型void,因爲目前它沒有返回一個有意義的值)。

+0

您可能希望在'choice'中添加另一個枚舉器,以防萬一最終用戶變得足夠聰明以便以某種方式輸入非合理值,然後在此情況下返回到'main_menu'。 –

+0

@AnirbanSarkar - 'main_menu'函數應該篩選出不適當的輸入並且只返回有效的選擇。 –