将指针传递给多个函数并获得段错误

时间:2013-06-22 21:53:08

标签: c++ function pointers

我试图在文字游戏练习中为Room创建一个框架。游戏的工作方式是Rooms是类,它包含指向Tiles指针数组的指针,每个tile都有一个指向Container的指针,该Container表示Tile上的项目。

这个的实现非常简单,编译得很好。但是,当我试图“放置”时,我遇到了一些问题。一个Thing对象'到'一个Tile。这是通过多个passthrough函数将指针传递给Thing对象来完成的。指针被传递给Tile的placeOnTile(Thing * i)函数,该函数将其传递给Tile的Container addItem(Thing* th)函数,该函数运行一个简单的检查以确保它适合在容器中(与maxSize int比较),如果适合,则返回true。

根据调试监视,指针(名为placer)不会通过传递更改(这很好)。但是,当它到达最终的passthrough函数(Container addItem(Thing* th)的函数)时,它将是段错误而不是继续运行程序。

下面列出了我能想到的相关代码示例。如果有更多我应该包括请告诉我。

在main中:

cout << "Bedroom Demo" << endl << endl;
    cout << "Creating bedroom obj...";
    Bedroom b1;  //this calls the constructor for Bedroom
    cout << "done." << endl << endl;
在Bedroom.h中

Bedroom()   //constructor
{
    makeNineSquare(1); //this creates an arry of 9 Tiles, arranged in a 3x3 grid
    Thing* placer;  //this will point to objects that you'll create

    placer = new Bed("Your bed","This is your bed.",false,false,true,1);  //constructor
    ti[2]->placeOnTile(placer);  //!!!!This is where the error occurs!!!!

    placer = new Decor("North-facing Window","The window to the north looks out into barren space",false,false,true);
    ti[1]->placeOnTile(placer);

    placer = new Desk("Your desk","Your desk is wooden and antique.",0,0,1,5);
    ti[3]->placeOnTile(placer);

    delete placer;  //for memory leaks
}
在Tile.h中

bool placeOnTile(Thing * i){return onTile->addItem(i);}
在Container.h中的

(onTile是一个封装在Tile中的Container对象):

bool addItem(Thing* th);

在Container.cpp中:

bool Container::addItem(Thing* th)
{
     if (numItems < maxSize)
     {
         contents[++numItems] = th;
         return true;
     }
else return false;
}

正如我上面提到的,调试手表显示“传递”的每一步都是&#39;除了最终的passthrough(Container)之外,它的工作正常。我做错了什么?

注意:ti在卧室内宣布。它是一个由9个瓦片组成的阵列,0到8,组成了一个房间&#39;。函数makeNineSquare只是一个在数组上实现二维链表​​的函数,创建了指向相邻Tiles的NESW指针。我这样创建它的原因是为了方便在数组中放置某些图块(如提供的代码所示),以及通过指针对象(如播放器)轻松遍历网格

这也允许全局通用移动命令(moveN只是curr = curr->getN而不是计算,以确定,例如7是否与2相邻。

1 个答案:

答案 0 :(得分:0)

根据你的代码,我不知道什么是numitems,但检查numitems ++是否导致数组超出索引。