我打算定义一个抽象类abstract_list作为链表类的接口
template <typename T>
class abstract_list
{
virtual void push(T & val)=0;
virtual void push(T && val)=0;
virtual void pop()=0;
virtual void print()=0;
virtual T & front()=0;
virtual bool empty()=0;
};
链表元素
template <typename T>
struct ListElmt
{
T & value;
ListElmt * next=nullptr;
ListElmt(T & val):value(val){}
ListElmt(T && val):value(val){}
};
单链表实现
template <typename T>
class list:public abstractlist<T>
{
private:
ListElmt<T> * head=nullptr;
ListElmt<T> * tail=nullptr;
int size=0;
public:
void push(T & val);
void push(T && val);
void pop();
void print();
T & front();
bool empty(){return size==0?true:false;}
~list();
};
这里只用关注push接口,因为就是在这里出了问题
template <typename T>
void list<T>::push(T & val)
{
auto new_elmt=new ListElmt<T>(val);
if(empty())
head=tail=new_elmt;
else
tail=tail->next=new_elmt;
size++;
}
print接口
void list<T>::print()
{
auto current=head;
while(current)
{
cout<<current->value<<'\t';
current=current->next;
}
}
当我在主函数写下
for(int i=0;i<10;i++)
l.push(i);
l.print()
打印结果:10 10 10 10 10 10 10 10 10 10
倘若我把i<10改为i<50,那么结果就是50个50
但我手动push时: l.push(1);l.push(2)
… l.push(10)
打印结果1~10
需要注意的是这是第一次用抽象基类做链表,请问这到底哪里出了问题