我目前正在从事有关浏览器历史记录的项目。我正在使用STL的列表实现来跟踪不同的网站。我已经弄清楚了大部分,但似乎无法解决错误:
屏幕截图;无法取消引用结束列表迭代器。
网站数据包含在“我的网站”对象中。
class BrowserHistory {
private:
list<Site> history;
list<Site>::iterator current = history.begin();
public:
void visitSite(string, size_t)
void backButton();
void forwardButton();
void readFile(string);
};
void BrowserHistory::visitSite(string x, size_t y)
{
while (current != history.end()) {
history.pop_back();
}
history.push_back({ x, y });
current++;
}
void BrowserHistory::backButton()
{
if (current != history.begin())
current--;
}
void BrowserHistory::forwardButton()
{
if (current != history.end())
current++;
}
void BrowserHistory::readFile(string filename)
{
string action, url;
size_t pageSize;
ifstream dataIn;
dataIn.open(filename);
while (!dataIn.eof()) {
dataIn >> action;
if (action == "visit") {
dataIn >> url >> pageSize;
history.push_back({ url, pageSize });
current++;
}
if (action == "back") {
current--;
}
if (action == "forward") {
current++;
}
}
dataIn.close();
}
谁能向我解释怎么了?预先感谢您的帮助。
答案 0 :(得分:1)
初始化current
时,列表为空。
将元素添加到列表不会突然使它成为有效的迭代器,即使它与end
不同。
看起来您在考虑迭代器非常类似于指针,但事实并非如此。
迭代器用于迭代,应被视为瞬态,不应将其存储供以后使用。
使用向量,并为current
使用索引,而不是迭代器。
此外,我会将“按钮”功能(历史记录关心按钮?)重命名为“ goBack”和“ goForward”,并在阅读时使用您的实际界面:
void BrowserHistory::readFile(string filename)
{
ifstream dataIn(filename);
string action;
while (dataIn >> action) {
if (action == "visit") {
string url;
size_t pageSize;
if (dataIn >> url >> pageSize) {
visitSite(url, pageSize);
}
else {
// Handle error
}
}
else if (action == "back") {
goBack();
}
else if (action == "forward") {
goForward();
}
else {
// Handle error
}
}
}