我试图在文字游戏练习中为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相邻。
答案 0 :(得分:0)
根据你的代码,我不知道什么是numitems,但检查numitems ++是否导致数组超出索引。