2
void Mainframe::OnClearNotebook( wxCommandEvent& e )
{
    int end = m_notebook->GetPageCount();
    for ( int i = 0; i < end; i++ )
    {
        if ( m_notebook->GetPageText( i ) != "Server Log" )
        {
            m_notebook->DeletePage(i);
        }
    }
}

此代码在此表单中崩溃,并显示消息“m_notebook->GetPageText() index out of range”;

如何正确遍历所有页面?

编辑,解决方案:

void Mainframe::OnClearNotebook( wxCommandEvent& e )
{   
    while ( m_notebook->GetPageCount() > 1 )
    {
        int end = m_notebook->GetPageCount() - 1;
        if ( m_notebook->GetPageText( end ) != "Server Log" )
        {
            m_notebook->DeletePage(end);
        }
        else
        {
            break;
        }
    }
}
4

2 回答 2

4

如果您务实地删除 GetPageCount() 将被更改,因此 end 将保留早期版本的值

例如。

你有 100 在 m_notebook->GetPageCount()

所以结束 = 100

迭代 10 个项目后,您将删除 5 个项目,因此现在列表将有 95 个项目,但您迭代最多 100 个 - 这可能是问题

于 2013-10-03T05:24:37.667 回答
2

如果要从非链接列表中删除项目,则需要迭代列表,并在另一个新列表中收集要删除的所有列表项的索引。完成迭代和收集索引后,使用您收集的每个索引在原始列表上调用 delete。

于 2013-10-03T05:30:37.303 回答