我对使用链接列表非常陌生。我试图通过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这样的输出,我只是想知道我做错了什么以及我可能如何解决它
答案 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
}
};