这个指针到底是怎么回事

What's actually going on with this pointer

本文关键字:怎么回事 指针      更新时间:2023-10-16

这是我的困惑开始的地方,所以首先声明一个空指针。然后执行选择,运行给定的任何输入,然后出现函数randomEncounter。

 cout << "1) Move, 2) Rest, 3) View Stats, 4) Quit: ";
            cin >> selection;
            Monster* monster = 0;
            switch( selection )
            {
            case 1:
                gameMap.movePlayer();
                // Check for a random encounter.  This function
                // returns a null pointer if no monsters are
                // encountered.
                monster = gameMap.checkRandomEncounter();
                // 'monster' not null, run combat simulation.
                if( monster != 0 )

所以下一个功能通过时,是

//refering to the once null pointer and now modifies something real?
monster = new Monster 

是否

0 = gameMap.checkRandomEncounter();

或者它指向的是零,而不是实际值,并耐心地等待指向什么?所以

0 = null;

直到函数运行:以下是函数

Monster* Map::checkRandomEncounter()
{
    int roll = Random(0, 20);
    Monster* monster = 0;
    if( roll <= 5 )
    {
        // No encounter, return a null pointer.
        return 0;
    }
    else if(roll >= 6 && roll <= 10)
    {
        monster = new Monster("Orc", 10, 8, 200, 1, 
            "Short Sword", 2, 7);
        cout << "You encountered an Orc!" << endl;
        cout << "Prepare for battle!" << endl;
        cout << endl;
    }

遭遇战时也是如此:

monster = new Monster();

这是修改了指向现在真实对象的曾经为null的指针,还是生成了一个全新的对象?我很困惑这一切是如何联系在一起的。功能中还有第二个

Monster* monster = 0;

这个是在哪里使用的,它是如何返回到遇到的调用函数的。我意识到它以某种方式通过指针返回,但肯定需要一些清晰度

发布的代码中的注释如果不是不言自明的话,那就什么都不是了。

调用方只是从一个最初为NULL(0)的Monster指针开始(故意不指向对象),如果selection1,则为其分配来自checkRandomEncounter()的返回值。如果该函数返回非空地址,则表示已返回Monster,并且应采取特定的响应行动。

// Check for a random encounter.  This function
// returns a null pointer if no monsters are
// encountered.
monster = gameMap.checkRandomEncounter();
// 'monster' not null, run combat simulation.
if( monster != 0 ) ...

关于checkRandomEncounter()

if( roll <= 5 )
{
    // No encounter, return a null pointer.
    return 0;
}

因此,如果滚动量低于5,函数将返回一个空指针,否则如果滚动量在6到10之间,则分配一个新的Monster并返回一个指针。

else if(roll >= 6 && roll <= 10)
{
    monster = new Monster("Orc", 10, 8, 200, 1, 
        "Short Sword", 2, 7);
    cout << "You encountered an Orc!" << endl;
    cout << "Prepare for battle!" << endl;
    cout << endl;
}

虽然没有显示,但最好有一些代码来处理当掷骰子在11到20之间时会发生什么,我猜可能是生成了不同的怪物类型,每个怪物都有不同的随机范围。(只是在黑暗中的一个镜头)。

无论如何,如果有可能,或者作者对正在发生的事情更具体一点,我很想知道怎么做。如果仍然不清楚,在进一步分析之前,您需要花时间学习C++中的基本指针细微差别。

最后,如果变量名称让您感到困惑,那么知道主代码中的monster指针变量与checkRandomEncounter()中的变量无关有帮助吗?除了后者用于计算由于代码结构而最终将分配给前者的返回值外,它们是完全不相关的不同指针。

您需要返回if的另一侧的指针(或者您没有包括我认为是的最后两行

return monster;
}

来自gameMap.checkRandomEncounter方法。

此外,你不应该用这种方法打印东西——只需专注于检查是否触发了遭遇战,然后这会影响游戏的流程。