我遇到了细分错误的问题,我想我知道问题出在哪里,但是我不确定如何解决它
我有这样的网格
class Grid {
std::vector<std::vector<Cell>> grid;
...
};
并且我有很多与该网格一起工作的成员函数。我的功能之一是初始化功能
void Grid::init(int n) {
gridSize=n;
vector<vector<Cell>> theGrid(n+1, vector<Cell>(n+1));
for(int r=0; r<n; ++r) {
for(int c=0; c<n; ++c) {
theGrid[r][n] = Cell();
theGrid[r][n].setCoords(r,c);
theGrid[r].push_back(theGrid[r][c]);
}
}
但是,一旦初始化网格,我的印象是我可以在其他成员函数中调用theGrid [x] [y],并且只要在同一方法上调用方法,就可以获得在此初始化的相同函数。宾语。每当我尝试访问其他成员函数中的TheGrid来对其进行处理时,都会遇到分段错误,除非包括
vector<vector<Cell>> theGrid(n+1, vector<Cell>(n+1));
这基本上意味着我没有使用我想要的网格。我该如何解决该问题?我希望能够以其他方法使用在初始化中初始化的网格。任何输入将不胜感激。谢谢。
最佳答案
在init
函数中声明:
vector<vector<Cell>> theGrid(n+1, vector<Cell>(n+1));
我不知道
n+1
维度的原因,但事实上,您声明的是名为theGrid
的局部变量,该变量可能与您的类的私有成员名称相同或不同(在发布的代码称为grid
),但可以肯定的是,其范围仅限于init
函数。这就是为什么您必须在所有其他函数中重新声明它以避免分段错误的原因。
真正的解决方法是在所有成员函数中使用类的成员变量的完全相同的名称,而不必每次都重新声明。
您可以在构造函数中设置vector的矢量大小(这本身不是一个好主意,请尝试使用1D vector并通过v(i * width + j)而不是v [i] [j]对其进行索引)类或
init
中的resize。