我已经创建了一个链表,其中包含C++Fifo
模板,我想创建方法pop()
但它不起作用。
我的方法应该执行以下任务:pop()
应该读取第一个FifoElement
的value
然后删除它。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
}