我是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;
}
答案 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
中编译的示例代码