从Java学习C ++,尝试创建链表

时间:2010-04-17 04:58:14

标签: java c++ pointers linked-list parameter-passing

我刚刚开始学习C++(来自Java)并且在做任何事情时遇到了一些严重的问题:P目前,我正在尝试制作链表,但必须做一些愚蠢的事情我一直得到“空值不被忽略,因为它应该是”编译错误(我把它标记在下面扔它的地方)。如果有人能帮我解决我做错的事情,我将非常感激:)

此外,我不习惯选择通过引用,地址或值传递,以及一般的内存管理(目前我的所有节点和数据都在堆上声明)。 如果有人对我有任何一般性建议,我也不会抱怨:P

LinkedListNode.cpp

的密钥代码
LinkedListNode::LinkedListNode()
{
    //set next and prev to null
    pData=0; //data needs to be a pointer so we can set it to null for
             //for the tail and head.
    pNext=0;
    pPrev=0;
}

/*
 * Sets the 'next' pointer to the memory address of the inputed reference.
 */
void LinkedListNode::SetNext(LinkedListNode& _next)
{
    pNext=&_next;
}

/*
 * Sets the 'prev' pointer to the memory address of the inputed reference.
 */
void LinkedListNode::SetPrev(LinkedListNode& _prev)
{
    pPrev=&_prev;
}
//rest of class

LinkedList.cpp的密钥代码

#include "LinkedList.h"

LinkedList::LinkedList()
{
    // Set head and tail of linked list.
    pHead = new LinkedListNode();
    pTail = new LinkedListNode();

     /*
      * THIS IS WHERE THE ERRORS ARE.
      */
    *pHead->SetNext(*pTail);
    *pTail->SetPrev(*pHead);
}
//rest of class

2 个答案:

答案 0 :(得分:6)

中的前导*
*pHead->SetNext(*pTail);
*pTail->SetPrev(*pHead);

不需要。

pHead是指向节点的指针,您将SetNext方法调用为pHead->SetNext(..),并通过引用传递object

->的{​​{3}}高于*

如此有效地,您试图取消引用不返回任何内容的函数SetNext的返回值,从而导致此错误。

答案 1 :(得分:3)

  

此外,我不习惯选择通过引用,地址或值传递,以及一般的内存管理(目前我拥有所有节点和堆上声明的数据)。如果有人对我有任何一般性建议,我也不会抱怨:P

前Java程序员总是这样做。而且它是颠倒的。 您实际上永远不会堆分配数据。对象应该在堆栈上声明,如果它们需要堆分配的内存,它们应该在内部处理,通过在它们的构造函数中分配它并在它们的析构函数中释放它。

这将导致更清晰,更安全的代码。

类成员也应该是值,而不是指针/引用,除非您明确需要在不同对象之间共享成员。如果类专有地拥有其成员,则只需使其成为非指针值类型。这样它就可以在类本身内部进行分配,而且您不需要跟踪新的/删除调用。

最简单的经验法则是不使用指针,除非你拥有。你需要要在别处分配的对象吗?为什么不能分配 here 并按值访问?即使对象必须从函数返回,或作为参数传递给另一个函数,复制通常也会处理。只需定义适当的拷贝构造函数和赋值运算符,并在必要时复制对象。