C++ 读取访问冲突(此->;headPtr为0xcdcd)
Remove(T&item)应该删除headPtr并将“item value”存储在“item”中并返回true,否则如果队列中没有元素,则返回false。我在这个函数中得到一个“读取访问冲突错误”。 下面是类和函数定义:C++ 读取访问冲突(此->;headPtr为0xcdcd),c++,linked-list,C++,Linked List,Remove(T&item)应该删除headPtr并将“item value”存储在“item”中并返回true,否则如果队列中没有元素,则返回false。我在这个函数中得到一个“读取访问冲突错误”。 下面是类和函数定义: class SharedQueue { public: SharedQueue(); ~SharedQueue(); //Return true if the queue is empty bool IsEmpty() const;
class SharedQueue {
public:
SharedQueue();
~SharedQueue();
//Return true if the queue is empty
bool IsEmpty() const;
//Enqueue the next item at the tail of the queue.
void Add(T value);
//Dequeue the next queue element and store it in "item" variable. The function returns false if the queue is empty and no item can be retrieved.
bool Remove(T &item);
void Print();
private:
struct QueueItem {
T item;
QueueItem *next;
};
//Fill in the The private data members.
QueueItem *headPtr;
QueueItem *tailPtr;
};
template <typename T> SharedQueue<T>::SharedQueue() {
headPtr = NULL;
tailPtr = NULL;
}
template <typename T>SharedQueue<T>::~SharedQueue() {
QueueItem *temp;
while (headPtr != NULL) {
temp = headPtr;
headPtr = headPtr->next;
delete temp;
}
}
template <typename T> bool SharedQueue<T>::IsEmpty() const {
if (headPtr == NULL && tailPtr == NULL) {
return true;
}
return false;
}
template <typename T> void SharedQueue<T>::Add(T aValue) {
if (headPtr == NULL) {
QueueItem *newItem = new QueueItem;
newItem->item = aValue;
tailPtr = headPtr = newItem;
}
else {
QueueItem *newItem = new QueueItem;
newItem->item = aValue;
tailPtr->next = newItem;
tailPtr = tailPtr->next;
}
}
template <typename T> bool SharedQueue<T>::Remove(T &item) {
if (headPtr == NULL) {
return false;
}
else {
QueueItem temp = *headPtr;
item = headPtr->item;
delete headPtr;
headPtr = temp.next;
return true;
}
}
template <typename T> void SharedQueue<T>::Print() {
QueueItem *temp = headPtr;
while (temp != NULL) {
std::cout << temp->item << "\n";
temp = temp->next;
}
}
类共享队列{
公众:
SharedQueue();
~SharedQueue();
//如果队列为空,则返回true
bool IsEmpty()常量;
//将队列末尾的下一个项目排队。
空加(T值);
//将下一个队列元素出列并将其存储在“item”变量中。如果队列为空且无法检索任何项目,则函数返回false。
bool移除(T和项目);
作废打印();
私人:
结构队列项{
T项;
队列项目*下一步;
};
//填写私有数据成员的列表。
队列项目*headPtr;
队列项目*tailPtr;
};
模板SharedQueue::SharedQueue(){
headPtr=NULL;
tailPtr=NULL;
}
模板SharedQueue::~SharedQueue(){
队列项目*温度;
while(headPtr!=NULL){
温度=水头;
headPtr=headPtr->next;
删除临时文件;
}
}
模板bool SharedQueue::IsEmpty()常量{
if(headPtr==NULL&&tailPtr==NULL){
返回true;
}
返回false;
}
模板void SharedQueue::Add(T aValue){
如果(headPtr==NULL){
QueueItem*newItem=新的QueueItem;
newItem->item=aValue;
tailPtr=headPtr=新项目;
}
否则{
QueueItem*newItem=新的QueueItem;
newItem->item=aValue;
tailPtr->next=newItem;
tailPtr=tailPtr->next;
}
}
模板bool SharedQueue::Remove(T和item){
如果(headPtr==NULL){
返回false;
}
否则{
QueueItem temp=*headPtr;
物料=表头->物料;
删除headPtr;
headPtr=下一个温度;
返回true;
}
}
模板无效SharedQueue::Print(){
QueueItem*temp=headPtr;
while(temp!=NULL){
std::下一个cout项;
}
}
将项目添加到非空的共享队列时
:
您从未设置newItem->next=NULL
您的私有
struct QueueItem
可以(也可能应该)有自己的构造函数/析构函数,以帮助确保这样的设置是一致的。当您将项添加到非空共享队列时
:
您从未设置newItem->next=NULL
您的私有
struct QueueItem
可以(也可能应该)有自己的构造函数/析构函数,以帮助确保这样的设置是一致的。为什么不使用std::queue
而不是手动实现?而且你的类没有复制构造函数,所以这可能会把你的项目搞砸。看见在任何情况下,我都建议将Remove()
的else
更改为:QueueItem*temp=headPtr->next;物料=表头->物料;删除headPtr;headPtr=温度代码>和顺便说一句,当你删除最后一项时,别忘了将tail
也重置为NULL。这是一个课堂作业,讲师给了我们起始代码,我们必须填写所有内容。请看:@Bobby:请展示一个演示你如何实际使用这个类的代码。@Bobby:你根本没有展示测试代码,只有类实现,但没有实际使用该类的代码。顺便说一句,由于您在构造之后从未将tail
设置为NULL,IsEmpty()
在至少添加了一个项之后,即使删除了所有项,也不会返回true。为什么不使用std::queue
而不是手动实现呢?而且你的类没有复制构造函数,所以这可能会把你的项目搞砸。看见在任何情况下,我都建议将Remove()
的else
更改为:QueueItem*temp=headPtr->next;物料=表头->物料;删除headPtr;headPtr=温度代码>和顺便说一句,当你删除最后一项时,别忘了将tail
也重置为NULL。这是一个课堂作业,讲师给了我们起始代码,我们必须填写所有内容。请看:@Bobby:请展示一个演示你如何实际使用这个类的代码。@Bobby:你根本没有展示测试代码,只有类实现,但没有实际使用该类的代码。顺便说一句,由于您在构造之后从未将tail
设置为NULL,IsEmpty()
在至少添加了一项之后,即使删除了所有项,也不会返回true。捕捉得好,我完全错过了。捕捉得好,我完全错过了。
QueueItem *newItem = new QueueItem;
newItem->item = aValue;
tailPtr->next = newItem;
tailPtr = tailPtr->next;