我坐在一个我不知道解决方案的问题面前。 最后我总是得到一个分段错误。
我创建了一个“Map”类,我存储了以下信息,这个Map在Gameclass中存储为Vector
class Map
{
private:
unsigned int map_id_;
unsigned int map_width_;
unsigned int map_height_;
std::vector< std::vector< int > > fields_;
Game *game_;
class Game
{
private:
...
std::vector< Map* > *v_map_;
...
std::vector< Map* > Game::getMapVector()
{
return *v_map_;
}
在游戏类中,我填写了信息,包括字段矢量。
for(int i = 0; i < height; i++)
{
std::vector< int > row;
for (int j = 0; j < width; j++)
{
is.read(reinterpret_cast<char*>(&fields), 1);
counter = counter - 1;
row.push_back(int(fields));
}
fields_vector.push_back(row);
}
如果我尝试在readin-process中直接输出我的地图,一切都很完美。
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
std::cout << fields_vector[i][j];
}
std::cout << std::endl;
}
直到现在一切正常。但是现在我得到了分段错误,如果我在自动迭代器中使用for循环调用它。
如果我尝试在第一个for循环中只输出一个带std::cout << (*it)->getMapFields()[1][1]
的元素,我会在这个位置得到正确的输出。
for(auto it = std::begin(game.getMapVector()); it != std::end(game.getMapVector()); it++)
{
std::cout << "ID: " << (*it)->getMapId()
<< ", width: " << (*it)->getMapWidth()
<< ", height: " << (*it)->getMapHeight() << std::endl;
for (int i = 0; i < (*it)->getMapHeight(); i++)
{
for (int j = 0; j < (*it)->getMapWidth(); j++)
{
std::cout << (*it)->getMapFields()[i][j];
}
std::cout << std::endl;
}
}
有没有我没看到的东西?也许在自动迭代器中不能使用for循环?
提前感谢您的帮助, 菲利普
答案 0 :(得分:5)
一个错误是:
std::vector< Map* > Game::getMapVector()
返回一个新的std::vector<Map*>
实例。这意味着以下begin
循环中使用的end
和for
迭代器引用不同的 std::vector
个实例:
for(auto it = std::begin(game.getMapVector());
it != std::end(game.getMapVector());
it++)
可能的解决方案:
getMapVector()
的结果存储到局部变量并将其用于迭代getMapVector()
以返回对const
std::vector<Map*>
)引用