链接列表ostream超载奇怪的值

时间:2017-09-29 20:10:43

标签: c++ c++11 linked-list

我对使用链接列表非常陌生。我试图通过decleration重载ostream opperator以获得双向链表:

template <class T> 
class DynamicList;

template <class T>

template <class T> 
class DynamicList 
{ 
private: 

Node<T> *head;

public: 
class Node 
{ 
 public:

    T* value;
    Node<T> *next;
    Node<T> *prev;

    Node(T val)
    {
        next = nullptr;
        prev = nullptr;
        value = &val;
    }

};
DynamicList();
~DynamicList();


void operator+=(const T);


friend std::ostream & operator<< <>(std::ostream &, const DynamicList<T> &); 
}; 

和功能保护:

template <class T>
ostream& operator << (ostream & out , const DynamicList<T> & rhs)
{
    Node<T>* nodePtr = rhs.head;
    Node<T>* nptr = nodePtr->next;
    while(nodePtr != NULL)
{
    cout<<*(nodePtr->value)<<" ";
    nodePtr = nodePtr->next;
}
out<<endl;
return out;
}

template <class T>
void DynamicList<T>:: operator +=(const T val)
{
Node<T>* nodePtr = nullptr;
T vall = val;
Node<T>* newNode = new Node<T>(vall);
if(!head)
{
    head = newNode;
}
else
{
    nodePtr = head;
    while((nodePtr->next))
    {
        nodePtr = nodePtr->next;
    }
    nodePtr->next = newNode;
    newNode->prev = nodePtr;
}

每当我调用opperator时,它会给出一个奇怪的输出,例如使用:

for(int i = 1; i <= 3; i++)
{
    list += i;
}
cout<<list;

它会输出像135727363 135727383 135727383这样的输出,我只是想知道我做错了什么以及我可能如何解决它

1 个答案:

答案 0 :(得分:-1)

你的问题在这里:

T* value;

您正在存储值的地址 问题是您正在存储超出范围的变量的地址。

T vall = val;
Node<T>* newNode = new Node<T>(vall);

变量vall是函数operator +=的本地变量,这意味着变量存在后它不再存在(并且可以包含任何内容)。

修复更改节点以存储值。

class Node 
{ 
 public:

    T        value;    // Notice no star here.
    Node<T> *next; 
    Node<T> *prev;

    Node(T const& val)      // Add `const&` here to avoid a copy.
    {
        next = nullptr;
        prev = nullptr;
        value = val;        // Notice no and `&` here
    }  

};