-1

さて、私は試験勉強をしているので、コードをできるだけシンプルにしようとしましたが、非常に奇妙なことが起こりました。次のコードを変更し、例外を使用してメインメニューに戻るという演習でした。

質問のコードは次のとおりです。

void ha_ha_loop()
{
 int i, c;

 while(1)
  {
     for(i=0; i < 3; i++)
     {
       cout << "Ha Ha Ha" << endl;
       sleep(3);
     } // for 
    ask_return(); 
  } // while 

} // ha_ha_loop 

void dollar_loop()
{

 int i;

   while(1)
    {
     for(i=0; i < 3; i++)
      {
        cout << "$$$$$$$$$ " << endl;
        sleep(3);
      } // for 

      ask_return(); 
    } /* while */

} // dollar_loop 

void mainloop()
{
  string answer;

 while (1)
 {

    cout << "Press 1 for Ha Ha Ha." << endl;
    cout <<  "Press 2 for $$$$$$$$." << endl;
    cout << "Press 3 for to quit." << endl;

    cin >> answer;

    switch (answer[0])
    {
      case '1':
       ha_ha_loop();
      case '2':
       dollar_loop();
      case '3':
       return;
    } // switch 

  } // while 

} // mainloop 

そして私がしたことは:

void ask_return() {
    char c;
    cout << "Return to main menu? y/n:"<<endl;
    cin >> c;
    if (c=='y') throw 1;
}

void ha_ha_loop()
{
 int i, c;

 while(1)
  {
     for(i=0; i < 3; i++)
     {
       cout << "Ha Ha Ha" << endl;

     } // for 
    ask_return(); 
  } // while 

} // ha_ha_loop 

void dollar_loop()
{

 int i;

   while(1)
    {
     for(i=0; i < 3; i++)
      {
        cout << "$$$$$$$$$ " << endl;
      } // for 

      ask_return(); 
    } /* while */

} // dollar_loop 

void mainloop()
{
  char answer;

 while (1)
 {

    cout << "Press 1 for Ha Ha Ha." << endl;
    cout <<  "Press 2 for $$$$$$$$." << endl;
    cout << "Press 3 for to quit." << endl;

    cin >> answer;

    switch (answer)
    {
      case '1':
       ha_ha_loop();
      case '2':
       dollar_loop();
      case '3':
       return;
    }
  }

}



int main() {
    try {
        mainloop();
    } catch (...) {
        mainloop();
    }
}

最初は正常に動作しますが、しばらくすると、未処理の例外メッセージでプログラムが終了します。なんで?

それを行うための最も簡単で正しい方法は何ですか?

編集:これは実用的な方法です:

void ask_return() {
    char c;
    cout << "Return to main menu? y/n:"<<endl;
    cin >> c;
    if (c=='y') throw 1;
}

void ha_ha_loop()
{
 int i, c;

 while(1)
  {
     for(i=0; i < 3; i++)
     {
       cout << "Ha Ha Ha" << endl;

     } // for 
    ask_return(); 
  } // while 

} // ha_ha_loop 

void dollar_loop()
{

 int i;

   while(1)
    {
     for(i=0; i < 3; i++)
      {
        cout << "$$$$$$$$$ " << endl;
      } // for 

      ask_return(); 
    } /* while */

} // dollar_loop 

void mainloop()
{
  char answer;

 while (1)
 {
    try {
    cout << "Press 1 for Ha Ha Ha." << endl;
    cout <<  "Press 2 for $$$$$$$$." << endl;
    cout << "Press 3 for to quit." << endl;

    cin >> answer;

    switch (answer)
    {
      case '1':
       ha_ha_loop();
      case '2':
       dollar_loop();
      case '3':
       return;
    }
    } catch (...) {
    }
  }

}



int main() {
    mainloop();
}
4

2 に答える 2

5

最も簡単な正しい方法はあなたが自分で解決することになっているものなので、私は「どうして」の部分だけに答えます。あなたがするとき

try {
    mainloop();
} catch (...) {
    mainloop();
}

を実行しmainloop、例外をキャッチします。例外がキャッチされると、ハンドラーはブロックの外でmainloop再度実行されます。毎回例外をキャッチして、繰り返し入りたいと思うでしょう。trymainloop

于 2012-07-09T22:18:34.723 に答える
0

OK、これが私の提案です。

まず、ask_return()書かれる必要があります。これは十分に単純であり、私が知る限り、多かれ少なかれ正しいことでした。私は実際にしかしを使用することを提案するつもりstd::exceptionです:

void ask_return()
{
    char c;
    cout << "Return to main menu? y/n" << endl;
    cin >> c;
    if ( c == 'y' )
    {
        throw std::exception(); // might as well use the class designed for this
    }
}

例外をキャッチできる場所はたくさんありますが、最も簡単な場所は次のmainloop()とおりです。

void mainloop()
{
    string answer;

    while (1)
    {

        cout << "Press 1 for Ha Ha Ha." << endl;
        cout <<  "Press 2 for $$$$$$$$." << endl;
        cout << "Press 3 for to quit." << endl;

        cin >> answer;

        try
        {
            switch (answer[0])
            {
                case '1':
                    ha_ha_loop();
                case '2':
                    dollar_loop();
                case '3':
                    return;
            } // switch 
        }
        catch (std::exception& e)
        {
            // do nothing, let the loop re-run.
        }

    } // while 

} // mainloop 

この場合、例外について何もする必要はありません。関数をループさせ続けるだけで、機能します。

于 2012-07-09T22:27:02.573 に答える