切换大小写后如何阻止变量重置?

时间:2018-10-21 07:05:03

标签: c++ class variables initialization switch-statement

我是C ++的新手。我正在尝试编写一个程序,要求用户选择:

[a]输入数字[b]读取数字[q]退出程序

如果用户选择一个,则将要求他输入一个数字,程序将保存它。
如果用户选择b,程序将显示输入的数字。
如果用户选择q,程序将退出。

但是,在我的程序中,我无法弄清楚用户输入了数字并选择读取后,变量'storage'将被重置并且无法显示输入的数字。

#include <iostream>
#include <string>
using namespace std;

class cNumber       //declare the class
{
public:     void WriteRead(char cmd);       //a for write; b for read
            bool Quit();

private:    int storage;
            int input;

};

void cNumber::WriteRead(char cmd) {
    if (cmd == 'a') {
        cout << "input:\n";
        cin >> input;
        storage = input;
    }

    if (cmd == 'b') {
        cout << "Here is your number:\n" << storage << endl;
    }
}

bool cNumber::Quit() {
    return true;
}

bool menu();
int main() {
    bool exitflag = false;
    while (exitflag == false) {
        exitflag = menu();
    }

    return 0;
}

bool menu() {
    cNumber Test;
    char choice;  // To store the command of user
    cout << "[a] Write number\n" << "[b] Read number\n" << "[q] Quit\n";
    cout << "Please enter your choice: ";
    cin >> choice;

    switch (choice) {
    case'a':
        Test.WriteRead('a');
        cout << "Write thx\n"; break;
    case 'b':
        cout << "Test Read\n";
        Test.WriteRead('b');
        cout << "\nRead thx\n"; break;
    case 'q':
        cout << "\nCloseeeee";
        return Test.Quit();
    }
    return false;
}

1 个答案:

答案 0 :(得分:2)

在您的bool menu()函数中,此

cNumber Test;

本地cNumber对象,它将在功能范围末端处从堆栈中销毁。这意味着您存储在私有storage变量中的内容也将随之消失。

下次再次调用bool menu()函数时,您正在创建cNumber的另一个对象,这与您之前所做的没有任何关系。因此,storage仅包含一些垃圾值,因为它没有在此函数范围内初始化。尝试访问未初始化的变量为 undefined behavior.

解决方案是在cNumber程序中只有一个main()实例,并每次通过引用将其传递给函数。

这意味着将代码更改为:

/* other code */
bool menu(cNumber& Test);
        // ^^^^^^^^^^^^
int main() {

    bool exitflag = false;
    cNumber Test;              // create a single instance for entire program
    while (exitflag == false)
    {
        exitflag = menu(Test); // and pass to the function by ref
    }

    return 0;
}

bool menu(cNumber& Test) // and pass to the function by ref
{ 
  char choice;
  // remaing code
}

编辑:由于OP要求在不使用构造函数的情况下查看解决方案,或者,可以使用类C ++ 11或更高版本来初始化成员变量。

>

以下是在 MSVS2017 and GCC8.2

中编译的示例代码