为什么用“ new”创建的对象不超出范围?

时间:2018-11-01 08:37:33

标签: c++

您好,对于这个极其难以置信的愚蠢问题感到抱歉-在这里完整的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;
} 

很抱歉,如果重复的话(我想一定是重复的,但是我找不到能回答我问题的任何东西。 谢谢大家的帮助!

3 个答案:

答案 0 :(得分:3)

您要混合两个不同对象。 gulasch1是一个指针。它指向一个动态分配的对象,是的。但是gulasch1本身是具有块范围的单独对象。

如果希望在循环后main的范围内使用它,请在循环前定义它,并将循环内的初始化转换为赋值。

答案 1 :(得分:1)

变量gulasch1仅在if语句的范围内,因此不能在外部使用。您在这里遇到的是编译问题-与堆与堆栈无关。是的,实际的Recipe在堆上,并且(如果已编译)在while循环之后仍然存在,但是您没有指向它的变量。

答案 2 :(得分:1)

您指向的对象Recipe在创建它的作用域之外,因为您使用new在免费存储(堆)上创建了该对象。

但是指向它(Recipe*)的指针gulasch1仅存在于您在其中创建的范围内,因为您将其设为自动(堆栈)变量。