У меня есть некоторые проблемы с ошибкой сегментации, и я думаю, что знаю, в чем проблема, но я не совсем уверен, как ее исправить
У меня есть сетка как таковая
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, в других методах. Любой вклад будет высоко ценится. Спасибо.
В вашем init
Функция, которую вы объявляете:
vector<vector<Cell>> theGrid(n+1, vector<Cell>(n+1));
Я не знаю причину n+1
измерение, но на самом деле, вы объявляете местный переменная с именем theGrid
, которое может иметь или не иметь то же имя частного члена вашего класса (в опубликованном коде это называется grid
), но, безусловно, его сфера ограничена init
функция.
Вот почему вы должны переопределить его во всех других функциях, чтобы избежать ошибки сегментации.
Реальное исправление должно заключаться в том, чтобы использовать во всех функциях-членах одно и то же имя переменной-члена класса, без пересматривать это каждый раз.
Вы можете установить размер вектора vector (что само по себе является плохой идеей, попробуйте использовать одномерный вектор и индексировать его, используя v (i * width + j) вместо v [i] [j]) в конструкторе вашего класса или изменить размер это внутри init
,
Если вы пытаетесь убедиться, что все векторы имеют правильную длину после вызова init()
, вы можете добиться этого, позвонив станд :: вектор :: размер ():
void Grid::init(int n)
{
theGrid.resize(n);
for(decltype(theGrid)::size_type rowIndex = 0; rowIndex < n; ++rowIndex))
{
auto& row = theGrid[rowIndex];
row.resize(n);
for(decltype(row)::size_type colIndex = 0; colIndex < n; ++colIndex)
{
auto& cell = row[colIndex];
cell.setCoords(rowIndex, colIndex);
}
}
}