2013-11-23 5 views
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 в книгеRepository.exe: 0xC0000005: Место для обнаружения нарушения доступа 0xCCCCCD04»., который подразумевает, что это не возвращает значение из функции bookSetUp().
Также в отладчике int ISBN возвращается, но не строка (строки) или bool.
Кто-нибудь знает, почему это не работает? это было бы огромной помощью, если бы вы могли!

ответ

1

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

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

  1. В книгеСоздание вы создаете 6 предметов книги.

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

  3. Выходите из функциональной книги.

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

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

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

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

E.g.

Book* a = new Book("A Tale of Two Cities", "Charles Dickens", 1203456, true); 
+0

Спасибо за новичка: P Должен ли я заполнить книжный список в главном? или есть способ обойти это? @john –

+0

@ Деннингтон-медведь Только что обновлено с этим. Короче используйте 'new'. – john

+0

Я видел динамическое распределение до того, как его великий просто не понимал, что они разрушаются в конце функции. Спасибо –

-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 (...);' – john

+0

Вы, кажется, путаете «кучу» и «стек» в своем ответе. Пожалуйста, исправьте это! –

+0

Я собираюсь реализовать это сейчас спасибо –

Смежные вопросы