C ++重启main而不会丢失变量

时间:2013-02-08 02:56:43

标签: c++ main

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

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

我在课堂上,我可以使用的工具受到限制,所以只有最基本的代码才可以接受。基本上,我正在寻找类似goto但更安全的东西(顺便说一句,goto,在本课程中也被禁止)。

4 个答案:

答案 0 :(得分:7)

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

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

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

希望这有帮助!

答案 1 :(得分:2)

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

答案 2 :(得分:1)

不应以递归方式调用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;
}

答案 3 :(得分:0)

将主体移动到另一个函数'myMain'并调用它而不是main。