您好,对于这个极其难以置信的愚蠢问题感到抱歉-在这里完整的C ++初学者。 我知道用“ new”运算符创建对象会在堆上创建它们,因此它们应该是全局的,对吗? 我用这段代码尝试了一下,但最终得到一个错误,我读为“超出范围”-伙计们,我在这里看不到什么?
int main()
{
bool mainLoop = true;
do
{
string userInput1, userInput2;
cout << endl << "Please enter a new recipe, or press X to quit: " << endl << endl;
cin >> userInput1;
if (userInput1 != "x")
{
cout << endl << "Please enter the recipes description: " << endl << endl;
cin >> userInput2;
Recipe *gulasch1 = new Recipe (userInput1, userInput2);
gulasch1->speak(); // this is just to try out if this outputs anything, and it does
}
else
{
cout << "Thanks and goodbye!" << endl;
mainLoop = false;
}
} while (mainLoop == true);
gulasch1->speak(); // why does this throw an error? ('gulasch1': undeclared identifier)
return 0;
}
很抱歉,如果重复的话(我想一定是重复的,但是我找不到能回答我问题的任何东西。 谢谢大家的帮助!
答案 0 :(得分:3)
您要混合两个不同对象。 gulasch1
是一个指针。它指向一个动态分配的对象,是的。但是gulasch1
本身是具有块范围的单独对象。
如果希望在循环后main
的范围内使用它,请在循环前定义它,并将循环内的初始化转换为赋值。
答案 1 :(得分:1)
变量gulasch1
仅在if
语句的范围内,因此不能在外部使用。您在这里遇到的是编译问题-与堆与堆栈无关。是的,实际的Recipe
在堆上,并且(如果已编译)在while
循环之后仍然存在,但是您没有指向它的变量。
答案 2 :(得分:1)
您指向的对象Recipe
在创建它的作用域之外,因为您使用new
在免费存储(堆)上创建了该对象。
但是指向它(Recipe*
)的指针gulasch1
仅存在于您在其中创建的范围内,因为您将其设为自动(堆栈)变量。