有关使用shared_ptr实现链表的问题

时间:2019-01-16 21:55:16

标签: c++14 singly-linked-list

我正在尝试实现一个简单的单链接列表,以了解std :: shared_ptr的语义。

下面列出了code.hpp文件:

#ifndef CODE_HPP
#define CODE_HPP

#include <iostream>
#include <memory>
#include <cstddef>

using std::cout;
using std::endl;
using std::shared_ptr;
using std::make_shared;

template <typename T1>
class node{
public:
   node(T1&);
   ~node();
public:
   const T1& get_data ();
   shared_ptr<node<T1>>& get_next ();
private:
   T1& data;
   shared_ptr<node<T1>> next;
};
template<typename T1,typename T2>
class list{
public:
   list(T2&);
   ~list();
public:
   void print ();
private:
  shared_ptr<node<T1>> head;
  shared_ptr<node<T1>> tail;
  size_t sz;
};

template<typename T1> node<T1>::node(T1& r):data(r){

   next = NULL;
}

template<typename T1> node<T1>::~node(){
}

template<typename T1> const T1& node<T1>::get_data(){
   return data;
}

template<typename T1> shared_ptr<node<T1>>& node<T1>::get_next(){
   return next;
}

template<typename T1,typename T2> list<T1,T2>::list(T2& r){

   auto it = r.begin();

   while(it != r.end()){
      if(it == r.begin()){
         head = make_shared<node<T1>>(*it);
         head->get_next() = tail;
      }
      else{
         tail = make_shared<node<T1>>(*it);
         tail = tail->get_next();
      }
      ++it;
   }

   tail = NULL;

   sz = r.size();
}

template<typename T1,typename T2> list<T1,T2>::~list(){
}

template<typename T1, typename T2> void list<T1,T2>::print(){

   auto temp = head;

   while(temp){
      cout << temp->get_data() << endl;
      temp = temp->get_next();
   }

   return;
}

#endif

以下是main.cpp中的源代码:

#include "code.hpp"
#include<array>
using std::array;

int main (void)
{
  array<int, 7> a{1, 2, 3, 4, 5, 6, 7}; 
  list<int,decltype(a)> l(a);
  l.print();

  return 0;
}

编译并运行上述代码时,列表模板中包含的print()函数仅打印对应于第一个节点的数据,即打印1。显然,这些节点没有链接在一起。

有人可以指出由于未发生链接而导致的逻辑错误吗?

0 个答案:

没有答案