当我把自己做的链表移植到c++时,我有点懵


#1

我打算定义一个抽象类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
需要注意的是这是第一次用抽象基类做链表,请问这到底哪里出了问题


#2

C++ 就有点 off topic 了


#3

引用不就是想这样吗


#4

这里用引用当然最后都是50了。。而且这个引用理论上出了for循环 i 就应该没了。。输出任何值都是可以的,毕竟ub


#5

懂了,我现在删帖还来得及吗
顺便问一下c++容器类的forward_list单链表是怎么实现的,源码在哪里,我用的Debian