【问题标题】:C++ restart main without losing variablesC ++重新启动main而不丢失变量
【发布时间】:2013-02-08 02:56:42
【问题描述】:

我的程序的主要功能显示一个开关菜单。当输入选项 1 时,会调用一个函数来“洗牌”一组“卡片”。改组完成后,该函数通过调用 main() 将程序返回到开头,从而再次显示菜单。

我遇到的问题是菜单的选项 4 将洗牌后的数组写入文件。但是当洗牌后重新启动程序时,数组数据丢失,因此输出的文件都是垃圾文件。有没有办法在不丢失数据的情况下重新启动 main()?

我在上课,我可以使用的工具有限,所以只能接受最基本的代码。基本上,我正在寻找类似 goto 但更安全一些的东西(顺便说一下,goto 在这个类中也是被禁止的)。

【问题讨论】:

  • 在 C++ 中调用 main 是非法的。哪个编译器允许这样做?
  • “我正在寻找类似 goto 但更安全一点的东西”这听起来很像循环语句的描述(whiledofor)...跨度>
  • @chris,调用 main 并不违法。你可以在 gcc 中做到这一点。它很可能与您可能想要的效果不同......但没关系。试试这个代码: int main(); int a() { 返回 main(); } int main() { 返回一个(); }
  • 请注意,虽然标准不允许这样做,但我所知道的每个编译器似乎都可以:stackoverflow.com/questions/2128321/…
  • @thang,我想这是因为我总是有迂腐警告作为错误,无论如何我建议这样做。根据标准,这是非法的,这是决定性因素。

标签: c++ main


【解决方案1】:

C++ 程序调用自己的main 函数实际上不是一个好主意。事实上,这会导致未定义的行为,这意味着您无法保证程序的行为。它可能会崩溃,或者继续处理损坏的数据,或者格式化您的硬盘等(不过,最后一个不太可能)。

我认为这反映了您的程序如何工作的一个更根本的问题。如果您希望数据在函数之间持久存在,则需要将该数据放置在不会被其他函数破坏的地方。例如,您可以将数据放入堆中,然后传递指向数据的指针。或者,您可以在 main 中将其定义为局部变量,然后将其传递给函数,并在完成后让这些函数返回。您还可以考虑制作表示数据的对象,然后将这些对象传递给不同的函数。

没有看到你的代码,我怀疑我能给出比这更具体的答案。在设计程序时,请牢记数据流。想想哪些数据需要去哪里以及如何去那里。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    你为什么要递归调用main(顺便说一句,这是标准禁止的)?只需使用循环(例如 do ... while)重复需要重复的 main 部分,将不得重置的变量(及其初始化)保留在循环之外。

    【讨论】:

      【解决方案3】:

      main() 函数不应被递归调用。
      您可以将游戏循环封装到 while() 函数中。

      看看这个例子:

      #include <iostream>
      #include <string>
      
      using namespace std;
      
      int main()
      {
          bool exitGame = false;
          // Game Loop
          while(!exitGame) {
      
              // Display menu
              cout << "Menu :" << endl;
              cout << "- Shuffle :  press 1" << endl;
              cout << "- Option 2 : press 2" << endl;
              cout << "- Option 3 : press 3" << endl;
              cout << "- Exit     : press 4" << endl;
              cout << "Enter your choice : ";
      
              // Get user input
              string choosenValue;
              cin >> choosenValue;
      
              cout << endl;
      
              // Process user input
              if (choosenValue == "1") {
                  cout << "You selected 'Shuffle'." << endl;
                  // Do cool stuff here !
      
              } else if (choosenValue == "2") {
                  cout << "You selected 'Option 2'." << endl;
                  // Do cool stuff here !
      
              } else if (choosenValue == "3") {
                  cout << "You selected 'Option 3'." << endl;
                  // Do cool stuff here !
      
              } else if (choosenValue == "4") {
                  cout << "You selected 'Exit'." << endl;
                  exitGame = true;
      
              } else {
                  cout << "Wrong value." << endl;
              }
              cout << endl;
          }
      
          return EXIT_SUCCESS;
      }
      

      【讨论】:

        【解决方案4】:

        将主体移动到另一个函数“myMain”并调用它来代替 main。

        【讨论】:

          猜你喜欢
          • 2021-01-24
          • 2020-02-13
          • 2023-03-21
          • 1970-01-01
          • 2014-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-22
          相关资源
          最近更新 更多