2

我刚开始学习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
4

2 回答 2

6

领先*

*pHead->SetNext(*pTail);
*pTail->SetPrev(*pHead);

不需要。

pHead是一个指向节点的指针,你调用SetNext它的方法作为通过引用pHead->SetNext(..)传递。object

->优先级高于*

因此,您正在尝试取消引用SetNext不返回任何内容的函数的返回值,从而导致此错误。

于 2010-04-17T05:12:11.047 回答
3

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

前 Java 程序员总是这样做。它是颠倒的。您几乎应该堆分配数据。对象应该在堆栈上声明,如果他们需要堆分配的内存,他们应该在内部处理它,在它们的构造函数中分配它并在它们的析构函数中释放它。

这导致更清洁和更安全的代码。

类成员也应该是值,而不是指针/引用,除非您特别需要在不同对象之间共享该成员。如果该类独占其成员,只需将其设为非指针值类型。这样它就在类本身内部分配,您不需要跟踪新/删除调用。

最简单的经验法则是除非必须,否则不要使用指针。您是否需要将对象分配到其他地方?为什么不能在这里分配,按值访问?即使对象必须从一个函数返回,或者作为参数传递给另一个函数,复制通常会解决这个问题。只需定义适当的复制构造函数和赋值运算符,并在必要时复制对象。

于 2010-04-17T12:14:01.787 回答