Вопрос о реализации связанного списка с использованием shared_ptr - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь реализовать простой односвязный список, чтобы понять семантику 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. Очевидно, что узлы не связаны друг с другом.

Может ли кто-нибудь указать на логическую ошибку в коде, из-за которой не происходит связывание?

...