我正在创建一个包含Cells的程序,为此我有一个Cell类和一个CellManager类。单元格以二维数组组织,Cell类管理器有两个int成员变量xgrid和ygrid,它们反映了数组的大小。
由于某些原因我无法弄清楚,这些成员变量在程序执行过程中发生了变化。任何人都可以看到为什么会发生这种情况,或者可能指出我在哪里寻找。
使用的类和函数如下所示:
class Cell
{
public:
Cell(int x, int y);
}
---------------------------------
class CellManager
{
public:
CellManager(int xg, int yg)
void registercell(Cell* cell, int x, int y);
int getxgrid() {return xgrid;}
int getygrid() {return ygrid;}
private:
int xgrid;
int ygrid;
Cell *cells[40][25];
}
-----------------------
and CellManagers functions:
CellManager::CellManager(int xg, int yg)
{
CellManager::xgrid = xg;
CellManager::ygrid = yg;
}
void CellManager::registercell(Cell *cell, int x, int y)
{
cells[x][y] = cell;
}
这是主要功能:
int main ()
{
const int XGRID = 40;
const int YGRID = 25;
CellManager *CellsMgr = new CellManager(XGRID, YGRID);
std::cout << CellsMgr->getxgrid() << std::endl; // PRINTS 40
std::cout << CellsMgr->getygrid() << std::endl; // PRINTS 25
//create the cells and register them with CellManager
for(int i = 1; i <= XGRID; i++) {
for(int j = 1; j <= YGRID; j++) {
Cell* cell = new Cell(i, j);
CellsMgr->registercell(cell, i, j);
}
}
std::cout << CellsMgr->getxgrid() << std::endl; // PRINTS A RANDOM LARGE INT, EX. 7763680 !!
std::cout << CellsMgr->getygrid() << std::endl; // PRINTS 1, ALWAYS !!
因此,我初始化一个CellMgr,并通过构造函数设置xgrid和ygrid。然后我创建了一堆Cells并将其注册到CellMgr。在此之后,CellMgr的两个成员变量发生了变化,有人知道这是怎么发生的吗?
答案 0 :(得分:12)
数组是零索引的,但你正在使用它们,好像它们是从1开始索引的。结果,你的数组索引将覆盖单元格,并写下数组的末尾,这是未定义的行为。当然可以覆盖随机的其他变量。