我正在尝试实现一个简单的单链接列表,以了解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。显然,这些节点没有链接在一起。
有人可以指出由于未发生链接而导致的逻辑错误吗?