这个指针究竟发生了什么

时间:2014-04-12 23:18:36

标签: c++ pointers null

这是我的混乱开始的地方,所以首先声明一个空指针。然后执行选择,运行任何输入,然后函数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();

这会修改指向现在真实对象的一次空指针,还是会创建一个全新的对象?我很困惑这一切是如何联系在一起的。在函数中还有第二个

Monster* monster = 0;

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

2 个答案:

答案 0 :(得分:1)

如果没有自我解释,发布的代码中的注释都没有。

调用方只是以Monster指针开始,该指针最初为NULL(0)(故意指向无对象),如果checkRandomEncounter()selection,则为1指定返回值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; }

Monster

因此,如果roll低于5,则函数返回空指针,否则如果它在6和10之间,则分配新的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

虽然没有显示,但最好有一些代码来处理滚动在11到20之间时发生的事情,我猜测可能会生成不同的怪物类型,每个类型都有不同的随机范围。 (只是在黑暗中拍摄)。

无论如何,如果有可能或者作者在发生的事情上更具体,我很想看看如何。如果仍然不清楚,你需要花时间在C ++中学习基本的指针细微差别,然后再进一步剖析。

最后,如果变量 names 让您感到困惑,那么知道主代码中的checkRandomEncounter()指针变量 nothing 是否有用呢?与{{1}}中的那个?除了后者用于计算由于代码结构最终将分配给前者的返回值之外,它们完全无关,不同的指针。

答案 1 :(得分:0)

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

return monster;
}
来自gameMap.checkRandomEncounter方法的

此外,您不应该在该方法中打印出东西 - 只需关注是否触发了遭遇,然后这会影响游戏的流程。