我刚刚开始学习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
答案 0 :(得分:6)
中的前导
*
*pHead->SetNext(*pTail);
*pTail->SetPrev(*pHead);
不需要。
pHead
是指向节点的指针,您将SetNext
方法调用为pHead->SetNext(..)
,并通过引用传递object
。
->
的{{3}}高于*
如此有效地,您试图取消引用不返回任何内容的函数SetNext
的返回值,从而导致此错误。
答案 1 :(得分:3)
此外,我不习惯选择通过引用,地址或值传递,以及一般的内存管理(目前我拥有所有节点和堆上声明的数据)。如果有人对我有任何一般性建议,我也不会抱怨:P
前Java程序员总是这样做。而且它是颠倒的。 您实际上永远不会堆分配数据。对象应该在堆栈上声明,如果它们需要堆分配的内存,它们应该在内部处理,通过在它们的构造函数中分配它并在它们的析构函数中释放它。
这将导致更清晰,更安全的代码。
类成员也应该是值,而不是指针/引用,除非您明确需要在不同对象之间共享成员。如果类专有地拥有其成员,则只需使其成为非指针值类型。这样它就可以在类本身内部进行分配,而且您不需要跟踪新的/删除调用。
最简单的经验法则是不使用指针,除非你拥有。你需要要在别处分配的对象吗?为什么不能分配 here 并按值访问?即使对象必须从函数返回,或作为参数传递给另一个函数,复制通常也会处理。只需定义适当的拷贝构造函数和赋值运算符,并在必要时复制对象。