我正在开发一个程序,它应该将每个Window放在一个列表中,调整大小,然后根据指定的布局将其移动到屏幕位置。
当我运行此函数时,我得到一个调试断言错误,说“列表迭代器不兼容”。
以下是代码:
void Control::checkForNewWindows()
{
for (std::list<Window>::iterator i = mainDetector.getWindowList().begin(); i != mainDetector.getWindowList().end(); ++i)
{
bool forBreak = false;
if ((i->getTitle().find("sample_title") != std::string::npos) && (i->getState() == false))
{
for (int y = 0; y < 3; y++)
{
for (int x = 0; x < 4; x++)
{
if (activeLayout.windowLayout[y][x].getHandle() == 0)
{
moveWindow(*i, activeLayout.dimensionsLayout[y][x].x, activeLayout.dimensionsLayout[y][x].y, activeLayout.dimensionsLayout[y][x].width,
activeLayout.dimensionsLayout[y][x].height);
activeLayout.windowLayout[y][x] = *i;
activeLayout.windowLayout[y][x].setState(true);
forBreak = true;
}
if (forBreak)
{
break;
}
}
if (forBreak)
{
break;
}
}
}
}
}
错误发生在第一个for循环期间,希望有人可以帮我解决这个问题
编辑:
这是getWindowList函数:
std::list <Window> Detector::getWindowList()
{
return windowList;
}
和windowList定义:
std::list <Window> windowList;
答案 0 :(得分:0)
你的循环如下:
for (std::list<Window>::iterator i = mainDetector.getWindowList().begin();
i != mainDetector.getWindowList().end();
++i)
鉴于上述情况,问题是:
std::list <Window> Detector::getWindowList()
{
return windowList;
}
您将返回列表的副本,而不是原始副本。因此,副本的迭代器将在循环中使用,而不是windowList
的迭代器。实际上,您在循环结构中使用了两个不同的迭代器,并且它们中没有一个引用原始列表,只引用副本。
修复是返回引用:
std::list <Window>& Detector::getWindowList()
{
return windowList;
}
您现在正在返回对实际列表的引用,而不是副本。现在,您在循环约束中使用的迭代器引用相同的列表,而不是不同的列表。