Я имею дело с дважды связанным списком. Он состоит из классов и сосредоточен вокруг текущего узла (вместо узла в начале или конце списка). Теперь моя функция печати вызовет ошибку, но только если я просмотрел список вообще. Моя функция печати просто печатает данные в текущем узле (при условии, что это не пусто). Вот моя печать функция: (гораздо более подробное описание моей иерархии файлов и коды в нижней части)C++ Не удалось распечатать данные указателя связанного списка
void queue::print(){
if (current){
std::cout << std::endl << std::endl << "+++++++++++++++++++ Webpage +++++++++++++++++++" << std::endl
<< "URL: " << current->data.getURL() << std::endl
<< "-----------------------------------------------" << std::endl
<< "Title: " << current->data.getTitle() << std::endl
<< "-----------------------------------------------" << std::endl
<< "Content: " << current->data.getContent() << std::endl
<< "+++++++++++++++++++++++++++++++++++++++++++++++" << std::endl << std::endl;
}
else{
std::cout << std::endl << "Your not on a page. Please navigate to a page first." << std::endl;
}
Теперь, если я заполнил список с двумя узлами данных, и я выполняю свою функцию печати, его 'напечатайте данные в узле очень хорошо. Однако, если я траверс к предыдущему узлу с моей GoBack() функцией:
void queue::goBack(){
if (!current->previous){
std::cout << "No previous page to go to!" << std::endl;
}
else{
temp2 = current;
current = current->previous;
}
}
Это будет выполнять отлично, но когда я пытаюсь напечатать данные в узле (с той же функцией печати) Я получаю эту ошибку :
Необработанное исключение в 0x003E7926 в Web Browser.exe: 0xC0000005: Место для обнаружения нарушения доступа 0xCDCDCE19.
и визуальная студия открывает файл без расширения, с похожим на него кодом C, называемым xstring, который имеет стрелку разрыва, указывающую на строку 1754 на ней.
Теперь позвольте мне объяснить свой код немного подробнее. У меня есть пять файлов: webQueue.h, webQueue.cpp, webPage.h, webPage.cpp, & main.cpp. Все перечисленные мной функции находятся в моем файле webQueue.cpp.
Вот webQueue.h:
#include "webPage.h"
class queue{
public:
queue();
void newPage(std::string u, std::string t, std::string c);
void goForward();
void goBack();
void print();
private:
struct Node{
webPage data;
Node* next;
Node* previous;
};
Node* temp;
Node* current;
Node* temp2;
};
И вот webPage.h:
#include <string>
class webPage{
public:
webPage();
webPage(std::string u, std::string t, std::string c);
std::string getURL();
void setURL(std::string u);
std::string getTitle();
void setTitle(std::string t);
std::string getContent();
void setContent(std::string c);
private:
std::string URL;
std::string title;
std::string content;
};
Мой файл webQueue.cpp включает в себя:
#include <iostream>
#include "webQueue.h"
Мой файл webPage.cpp включает в себя только webPage.h и мой файл main.cpp (который содержит мою исполняемую функцию) включают:
#include <iostream>
#include <string>
#include "webQueue.h"
Хотя эти отношения могут показаться немного запутанными, все они должны быть действительными. Файлы cpp связаны с их заголовочными файлами с тем же именем (при условии, что файл заголовка существует), а также main.cpp, связанный с webQueue.h и webQueue.h, связанным с webPage.h. Я не вижу, что я делаю неправильно с моим кодом, хотя это, вероятно, только потому, что мне сложно понять, как работают указатели. Я предполагаю, что ошибка в коде моих функций print(), goBack() и goForward() (хотя я не могу проверить функцию goForward() до тех пор, пока не исправлю функцию goBack()), но я не могу скажите, что случилось.
Любая помощь, которую вы, ребята, можете дать, будет очень благодарна, так как я в тупике. Вот ссылка на все файлы, чтобы вы могли протестировать эту программу для себя и посмотреть, есть ли у меня какие-либо другие функции с ошибками: https://www.dropbox.com/s/yekrz6dln1v9npk/webQueue.zip?dl=0
Добро пожаловать на переполнение стека. Я не могу переоценить важность обучения для подготовки [минимального полного примера] (http://stackoverflow.com/help/mcve). Поставьте свой код на самый простой пример, который все еще воспроизводит ошибку, и ошибка, вероятно, будет очевидна; если это не так, вы можете опубликовать небольшой, автономный пример для нас, чтобы посмотреть. – Beta
@Beta Вот почему я включил загрузку Dropbox. – Larrimus
В Visual Studio есть классные отладочные материалы, такие как точки останова, которые вы можете установить в строке перед тем, как ваша программа получит необработанное исключение. И список часов, чтобы вы могли видеть значения переменных в вашей программе. Пожалуйста, используйте их, чтобы увидеть, соответствуют ли значения, как вы ожидали, перед их печатью. – KompjoeFriek