2016-04-28 13 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と関数がうまく連携していないことを理解していますが、少なくとも同じものに近い別の方法がありますか?同様にlogin機能(及び、中gotoを取り除くために、またgotoステートメントを含むメインメニュー関数を作成するには?

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; 
} 

+1

コードに 'goto'を使用しないでください。必要な場合があるかもしれませんが、これは一つではありません。 'goto'の代わりにループと関数を使用してください。 – NathanOliver

+0

些細なイニシャライザやデストラクタを飛び越えるゴモは災害のためのレシピです。 –

+0

'std :: endl'が行う余分なものを必要としない限り、' en'の定義を '#define en '\ n''に変更してください。 –

答えて

4

通常のアプローチは、入力を取得し、選択されたかを示す値を返すmain_menu関数を記述することです、)メニューのもので、単にループを使用しますが、現在意味のある値を返さないため

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

を(私も)voidlogin()の戻り値の型を変更しました。

+0

'choice'に別の列挙子を追加したいかもしれません。ちょうどエンドユーザが何らかの方法で妥当なもの以外の値を入力するようになったら、その場合は' main_menu'にループバックしてください。 –

+0

@AnirbanSarkar - 'main_menu'関数は不適切な入力を除外し、有効な選択肢のみを返すべきです。 –

関連する問題