用户定义的链表从函数返回指针

时间:2013-11-23 15:46:53

标签: c++ function pointers linked-list

我知道我曾经问过一个类似的问题,但它仍然没有用。抱歉重复我不知道为什么它不起作用。我创建了自己的链表(不使用stl库)我已经设置了类,并且完美地完成了我对它的需求。当我使用函数填充列表时,我遇到的问题是获取引用。 在我的主要部分,我调用了用于填充列表的函数bookSetUp()。我使这个函数等于临时指针。 (下面是代码)
Main.cpp的

Book* temp = bookSetUp();
while(temp!=NULL)
{
    cout<<temp->getName()<<endl;
    cout<<temp->getAuthor()<<endl;
    cout<<temp->getISBN()<<endl;
    temp = temp->getNext();
}

bookSetUp()位于另一个名为 functions.cpp 的.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可用性 该程序在bookRepository.exe中的“0x00B16886处的未处理异常:0xC0000005:访问冲突读取位置0xCCCCCD04。”崩溃,我猜这意味着它没有从bookSetUp()函数返回值。 /> 同样在调试器中,int ISBN返回但不返回字符串或bool 有谁知道为什么这不起作用?如果可以的话,这将是一个巨大的帮助!

2 个答案:

答案 0 :(得分:1)

对于那些不太了解如何使用指针的新手来说,这是一个非常普遍的误解。

一次一步。

  1. 在bookSetup中,您可以创建6个Book对象。

  2. 您设置了各种指针,特别是将temp设置为a的地址 书。

  3. 退出功能bookSetup。

  4. 此时所有Book对象都被销毁了!

  5. 所以你从bookSetup返回一个指向已经被破坏的对象的指针。

  6. 因此,当您尝试使用该指针时程序崩溃。

  7. 此方法无法正常工作。您需要了解另一种称为“动态分配”的技术。这使用new来创建图书。动态创建的对象不会自动销毁,因此对于链接列表,您确实需要使用动态分配。

    E.g。

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

答案 1 :(得分:-1)

是的,我可以说。

在c ++中,对象保存在堆中。当函数超出范围时,释放(删除)堆中保存的变量。

你的程序中的问题是:

booksetup函数正在堆上创建对象 然后它将引用(内存中的地址)返回给那些对象。但是当函数结束时,堆中的所有对象都将被删除。因此,您返回一个无效的地址。

为了解决这个问题,你需要将这些对象保存在堆栈而不是堆中。

为此你使用关键字“new”(堆栈上的“new”关键字分配空间)

如果我记得这是语法:

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