C++ 带模板的链表 - 如何创建 pop()?



我已经创建了一个链表,其中包含C++Fifo模板,我想创建方法pop()但它不起作用。

我的方法应该执行以下任务:
pop()应该读取第一个FifoElementvalue然后删除它。
operator>>应该做同样的事情。

push()应该在 Fifo 中创建 T 对象的副本。
operator<<应该像push()一样做同样的事情。

编译时,出现以下错误:
request for member 'value' in '((Fifo<std::__cxx11::basic_string<char> >*)this)->Fifo<std::__cxx11::basic_string<char> >::temp', which is of pointer type 'Fifo<std::__cxx11::basic_string<char> >::FifoElement*' (maybe you meant to use '->' ?)

我的班级:

#include "Fifo.h"
#include <iostream>
using namespace std;
template <typename T>
Fifo<T>::Fifo(){
top = NULL;
last = NULL;
temp = NULL;
}
template <typename T>
Fifo<T>::~Fifo(){
}
template <typename T>
Fifo<T>& Fifo<T>::operator<<(T const& val){
Fifo::push(val);
Fifo::s++;
return *this;
}
template <typename T>
Fifo<T>& Fifo<T>::operator>>(T& val){
Fifo::pop();
}
template <typename T>
Fifo<T>::operator int() const{
return s;
}
template <typename T>
void Fifo<T>::push(const T& val){
FifoElement *temp = new FifoElement;
temp->value=val;
temp->next=NULL;
if(top==NULL){
top=temp;
last=temp;
temp=NULL;
}
else{
last->next=temp;
last=temp;
}
}
template<typename T>
T Fifo<T>::pop(){
temp=top;
top=top->next;
return temp.value; //here I'm getting an error! 
delete temp;
}
template<typename T>
int size(){
return Fifo<T>::s;
}
template<typename T>
int info(){
return Fifo<T>::s;
}

我的标题:

#ifndef FIFO_H
#define FIFO_H
template <typename T>
class Fifo
{
public:
Fifo();
~Fifo();
void push(const T& val);
T pop();
Fifo& operator<<(T const& val);
Fifo& operator>>(T& val);
operator int() const;
int size();
int info();

private:
//Packet FifoElement
struct FifoElement{
T value;
FifoElement* next;
};
FifoElement* top;
FifoElement* last;
FifoElement* temp;
int s;
};
#endif // FIFO_H

从注释中,您得到的错误是这样的:

"(

(Fifo>(this(->Fifo>::temp"中的"值",其指针类型为"Fifo>::FifoElement"(也许您打算使用"->"?

错误有点说明问题。

问题是temp是一个指针。指针不能使用.语法。您要么需要先取消引用它(*(,如下所示:

(*temp).value

或者,更好的是,使用箭头(->(表示法,就像它说的那样:

temp->value

你的代码有一些问题,虽然我特别回答了你问的问题,但这里有一些你想要解决的代码问题。

首先,您的pop()函数:

//...
return temp->value;
delete temp;

return某些内容后,您无法执行任何代码。因此,您有内存泄漏。相反,请执行此操作:

//...
T result = temp->value;
delete temp;
return result;

这将避免pop()函数中的内存泄漏。

虽然我们正在讨论内存泄漏的主题,但您还有另一个问题:

template <typename T>
Fifo<T>::~Fifo(){
}

析构函数不执行任何操作,一旦列表超出范围,就会导致内存泄漏。我宁愿把如何正确实现它留给你一个练习,但只要知道你需要删除列表中的所有内容。

接下来,我们来谈谈operator<<()

template <typename T>
Fifo<T>& Fifo<T>::operator<<(T const& val){
Fifo::push(val);
Fifo::s++;
return *this;
}

这应该可以正常工作,但s++可能不应该在这里。push()应该管理大小。如果没有,那么您应该添加它。这是因为可以直接调用push()。如果是这样,则s变量可能会损坏(也就是说,它与实际大小不匹配(。

如果push()确实管理它,那么你不应该在operator<<()中修改它,因为这会使大小增加两倍,也使s变量与实际大小不匹配。

最后,operator<<()

template <typename T>
Fifo<T>& Fifo<T>::operator>>(T& val){
Fifo::pop();
}

这是有问题的,因为您实际上并没有设置val。您只需pop()堆栈并丢弃其值。

它应该如下所示:

template <typename T>
Fifo<T>& Fifo<T>::operator>>(T& val){
val = pop();
return *this; // don't forget to return the list like you stated in your function declaration
}

相关内容

  • 没有找到相关文章

最新更新