Я знаю, что я задал подобный вопрос некоторое время назад, но он все еще не работает. Извините за повторение. Я просто не знаю, почему это не работает. Я создал свой собственный связанный список (не используя библиотеку stl). У меня установлены мои классы и отлично работают, как я их тоже хочу. Проблема, с которой я сталкиваюсь, - вернуть ссылку, когда я использую функцию для заполнения списка. в основном я вызываю функцию bookSetUp()
которая используется для заполнения списка. Я делаю эту функцию равной указателю temp. (Heres код)
main.cpp
Book* temp = bookSetUp();
while(temp!=NULL)
{
cout<<temp->getName()<<endl;
cout<<temp->getAuthor()<<endl;
cout<<temp->getISBN()<<endl;
temp = temp->getNext();
}
bookSetUp() находится в другом.cpp файле с именем functions.cpp (ссылки работают между двумя.cpp, как я их протестировал)
functions.cpp Book* bookSetUp()
{
//The items that populate the list
Book a("A Tale of Two Cities", "Charles Dickens", 1203456, true);
Book b("Lord of the rings", "J.R.R Tolkein", 123456, true);
Book c("Le Petit Prince", "Antoine de Saint-Exupéry", 123457, true);
Book d("And Then There Were None", "Agatha Christie", 123458, true);
Book e("Dream of the Red Chamber","Cao Xueqin",123459, true);
Book f("The Hobbit","J.R.R Tolkein",123467, true);
a.setPrev(NULL);
a.setNext(&b);
b.setPrev(&a);
b.setNext(&c);
c.setPrev(&b);
c.setNext(&d);
d.setPrev(&c);
d.setNext(&e);
e.setPrev(&d);
e.setNext(&f);
f.setPrev(&e);
f.setNext(NULL);
Book* temp = &a;
return temp;
}
Как вы можете видеть, я пытаюсь вернуть указатель на первый элемент в списке, чтобы main имел к нему доступ. В моем классе книги есть атрибуты: имя строки, строковый автор, int isbn и bool.
Программа выходит из строя с "Необработанным исключением в 0x00B16886 в bookRepository.exe: 0xC0000005: место обнаружения нарушения доступа 0xCCCCCD04". что im guessing означает, что он не получает значение обратно из функции bookSetUp().
Также в отладчике возвращается int ISBN, но не строка (строки) или bool.
Кто-нибудь знает, почему это не работает? это было бы огромной помощью, если бы вы могли!
Это очень распространенное недоразумение новичков, которые действительно не понимают, как следует использовать указатели.
Один шаг за раз.
В bookSetup вы создаете 6 объектов книги.
Вы можете установить различные указатели, в частности, установить temp
на адрес a
книге.
Вы выходите из функции bookSetup.
В этот момент все объекты Книги уничтожаются!
Таким образом, вы вернулись из bookSetup с указателем на объект, который был уничтожен.
Как следствие, когда вы пытаетесь использовать этот указатель, ваша программа вылетает из строя.
Этот метод не может работать. Вам нужно узнать о другом методе под названием "динамическое распределение". Это использует new
для создания книг. Динамически созданные объекты не уничтожаются автоматически, поэтому для связанного списка вам действительно нужно использовать динамическое распределение.
Например
Book* a = new Book("A Tale of Two Cities", "Charles Dickens", 1203456, true);
Да, я могу сказать.
в c++ объекты сохраняются в куче. когда функция выходит из области действия, переменные, которые были сохранены в куче, освобождаются (удаляются).
проблема в вашей программе:
ваша функция bookSetup создает объекты в куче, а затем возвращает ссылку (адрес в памяти) на эти объекты. но когда функция заканчивается, все объекты в куче удаляются. поэтому вы возвращаете адрес, который указывает на ничего.
чтобы исправить эту проблему, вам нужно сохранить эти объекты в стеке вместо кучи.
для этого вы используете ключевое слово "новый" ("новое" ключевое слово, выделяющее пространство в стеке)
если я помню, что это синтаксис:
Book* a = new Book("A Tale of Two Cities", "Charles Dickens", 1203456, true);
Book* b= new Book("Lord of the rings", "J.R.R Tolkein", 123456, true);
Book* c= new Book("Le Petit Prince", "Antoine de Saint-Exupéry", 123457, true);
Book* d= new Book("And Then There Were None", "Agatha Christie", 123458, true);
Book* e= new Book("Dream of the Red Chamber","Cao Xueqin",123459, true);
Book* f= new Book("The Hobbit","J.R.R Tolkein",123467, true);
Book* a = new Book(...);
stack
в своем ответе. Пожалуйста, исправьте это!
new
.