Невозможно разыменовать конечный список итератора - PullRequest
0 голосов
/ 17 октября 2019

В настоящее время я работаю над проектом об истории браузеров. Я использую реализацию списка STL для отслеживания различных сайтов. Я понял большинство из них, но не могу решить эту ошибку:

Снимок экрана;не может разыменовать конечный итератор списка.

Screenshot; cannot dereference end list iterator.

Данные веб-сайта содержатся в объектах моего сайта.

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();
}

Может кто-нибудь объяснить мне, что не так? ? Заранее спасибо за любую помощь.

1 Ответ

1 голос
/ 17 октября 2019

При инициализации 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
       }
   }
}
...