Пользовательский связанный список, возвращающий указатель из функции

0

Я знаю, что я задал подобный вопрос некоторое время назад, но он все еще не работает. Извините за повторение. Я просто не знаю, почему это не работает. Я создал свой собственный связанный список (не используя библиотеку 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.
Кто-нибудь знает, почему это не работает? это было бы огромной помощью, если бы вы могли!

Теги:
pointers
function
linked-list

2 ответа

1
Лучший ответ

Это очень распространенное недоразумение новичков, которые действительно не понимают, как следует использовать указатели.

Один шаг за раз.

  1. В bookSetup вы создаете 6 объектов книги.

  2. Вы можете установить различные указатели, в частности, установить temp на адрес a книге.

  3. Вы выходите из функции bookSetup.

  4. В этот момент все объекты Книги уничтожаются!

  5. Таким образом, вы вернулись из bookSetup с указателем на объект, который был уничтожен.

  6. Как следствие, когда вы пытаетесь использовать этот указатель, ваша программа вылетает из строя.

Этот метод не может работать. Вам нужно узнать о другом методе под названием "динамическое распределение". Это использует new для создания книг. Динамически созданные объекты не уничтожаются автоматически, поэтому для связанного списка вам действительно нужно использовать динамическое распределение.

Например

Book* a = new Book("A Tale of Two Cities", "Charles Dickens", 1203456, true);
  • 0
    Спасибо за новичка: P тогда я должен был бы заполнить список книг в основном? или есть способ обойти это ?? @John
  • 0
    @ Деннингтон-медведь Только что обновил способ обойти это. Короче используйте new .
Показать ещё 1 комментарий
-1

Да, я могу сказать.

в 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);
  • 0
    Это должна быть Book* a = new Book(...);
  • 0
    Вы, кажется, путаете «кучу» и stack в своем ответе. Пожалуйста, исправьте это!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню