我对C ++很陌生,这段代码在我的书中是一个例子,所以它应该可以工作,因为我必须在这里实现一些新功能。但是,我复制了代码行for line,我不断收到此错误消息,现在我的代码不会编译,直到我修复它。
它说我的本地指针'节点'正在使用。我不知道这究竟意味着什么。谁能告诉我什么是实际告诉我的错误?也有人可以帮我解决这个问题,这样我可以开始我的项目吗?我只是要求代码,因为这不是我项目的一部分,它已由老师提供。
这是我的代码:
// ListNode.h
#ifndef _LISTNODE_H
#define _LISTNODE_H
#include <cstdlib>
typedef int ItemType;
class ListNode {
friend class LList;
public:
ListNode(ItemType item, ListNode* link = NULL);
private:
ItemType item_;
ListNode *link_;
};
inline ListNode::ListNode(ItemType item, ListNode *link)
{
item_ = item;
link_ = link;
}
#endif // _LISTNODE_H
// LList.h
#ifndef _LLIST_H
#define _LLIST_H
#include "ListNode.h"
class LList {
public:
LList();
LList(const LList& source);
~LList();
LList& operator=(const LList& source);
int size() { return size_; }
void append(ItemType x);
void insert(size_t i, ItemType x);
ItemType pop(int i = -1);
ItemType& operator[](size_t position);
private:
// methods
void copy(const LList &source);
void dealloc();
ListNode* _find(size_t position);
ItemType _delete(size_t position);
// data elements
ListNode *head_;
int size_;
};
#endif // _LLIST_H
// LList.cpp
#include "LList.h"
LList::LList()
{
head_ = NULL;
size_ = 0;
}
ListNode* LList::_find(size_t position)
{
ListNode *node = head_;
size_t i;
for (i = 0; i<position; i++) {
node = node->link_;
}
return node;
}
ItemType LList::_delete(size_t position)
{
ListNode *node, *dnode;
ItemType item;
if (position == 0) {
dnode = head_;
head_ = head_->link_;
item = dnode->item_;
delete dnode;
}
else {
node = _find(position - 1);
if (node != NULL) {
dnode = node->link_;
node->link_ = dnode->link_;
item = dnode->item_;
delete dnode;
}
}
size_ -= 1;
return item;
}
void LList::append(ItemType x)
{
ListNode *node, *newNode = new ListNode(x);
if (head_ != NULL) {
node = _find(size_ - 1);
node->link_ = newNode;
}
else {
head_ = newNode;
}
size_ += 1;
}
void LList::insert(size_t i, ItemType x)
{
ListNode *node;
if (i == 0) {
head_ = new ListNode(x, head_);
}
else {
node = _find(i - 1);
node->link_ = new ListNode(x, node->link_);
}
size_ += 1;
}
ItemType LList::pop(int i)
{
if (i == -1) {
i = size_ - 1;
}
return _delete(i);
}
ItemType& LList::operator[](size_t position)
{
ListNode *node;
node = _find(position);
return node->item_;
}
LList::LList(const LList& source)
{
copy(source);
}
void LList::copy(const LList &source)
{
ListNode *snode, *node;
snode = source.head_;
if (snode) {
node = head_ = new ListNode(snode->item_);
snode = snode->link_;
}
while (snode) {
node->link_ = new ListNode(snode->item_);
node = node->link_;
snode = snode->link_;
}
size_ = source.size_;
}
LList& LList::operator=(const LList& source)
{
if (this != &source) {
dealloc();
copy(source);
}
return *this;
}
LList::~LList()
{
dealloc();
}
void LList::dealloc()
{
ListNode *node, *dnode;
node = head_;
while (node) {
dnode = node;
node = node->link_;
delete dnode;
}
}
我知道问题究竟在哪里(我的代码中的第104行)
node->link_ = new ListNode(snode->item_);
这部分代码就是问题所在。任何人都可以帮我解决这个问题,以便我可以处理我的程序吗?谢谢!
既然我之前的问题得到了回答,我就有了新的问题。
我将如何测试我的代码?我有几行,但当我尝试打印出我的LList的内容时,它会一直出错。这是我的测试代码:
#include "LList.h"
int main()
{
LList b, c;
int x;
b.append(1);
b.append(2);
b.append(3);
c.append(4);
c.append(5);
c = b;
x = b.pop();
}
任何人都可以帮我写一个有效的测试代码,这是我开始添加不同功能所需的最后一件事。
答案 0 :(得分:3)
这可能是由于警告被视为构建中的错误。编译器抱怨在访问node
时可能无法初始化node->link
。但实际情况并非如此,因为如果snode
为空,则不会访问while
块,因此您将无法访问未初始化的内存。如果您想让警告消失,将while
循环放在if
块内可能会有效:
snode = source.head_;
if (snode) {
node = head_ = new ListNode(snode->item_);
snode = snode->link_;
while (snode) {
node->link_ = new ListNode(snode->item_);
node = node->link_;
snode = snode->link_;
}
}
答案 1 :(得分:0)
这是一个错误警告,因为编译器似乎认为您将使用该节点而未分配它(因为它可能会跳过if语句)。在这种情况下,由于永远不会输入while (snode)
,我不知道会发生这种情况。
您可以忽略此警告(禁止将警告视为项目设置中的错误)或从此特定代码部分(#pragma warning(disable : 4703)
)中删除此警告。
要构建而不处理警告,因为错误转到:项目 - &gt;属性 - &gt; C / C ++ - &gt;将警告视为错误。禁用此选项或使用the pragma directives。