我无法为我的双向链接列表创建“ <<”的重载函数。
这是我的头文件:
#ifndef SORTEDLIST_H
#define SORTEDLIST_H
#include <iostream>
class SortedList {
private:
typedef struct node {
int data;
node* next;
node* prev;
}*nodePtr;
int theSize;
nodePtr head;
nodePtr tail;
public:
SortedList();
//~SortedList();
void insertItem(int inData);
bool deleteItem(int delData);
friend ostream& operator <<(ostream& ot, const SortedList& sL);
int size() const;
bool empty() const;
};
#endif
这是我的构造函数:
SortedList::SortedList() {
//Set pointers equal to NULL
head = NULL;
tail = NULL;
theSize = 0;
head = new node; //create new node of 3 parts: head, data and prev
tail = new node; //create new node of 3 parts: head, data and prev
head->next = tail; //next partition points to tail
head->prev = NULL; //not necessary to put in?
tail->prev = head; //prev partition points to head
tail->next = NULL; //not necessary to put in?
/*temp->next = tail; //access the node the temp pointer is pointing to, set the 'next' part equal to tail*/
}
这是我无法使用的ostream重载函数:
ostream& operator<<(ostream& ot, const SortedList& sL)
{
sL.nodePtr temp;
temp = sL.head->next;
while (temp != sL.tail) {
ot << temp->data << " ";
temp = temp->next;
}
ot << "\n";
}
它总是告诉我sL.NodePtr,sL.head,sL.tail无法访问。我确实将其设置为朋友功能,所以我不确定为什么。
答案 0 :(得分:1)
operator<<
的实现存在几个问题:
sL.nodePtr
必须为SortedList::nodePtr
。
while
循环是完全错误的。它不考虑空列表,并且忽略非空列表的tail
节点。哦,等等,您的列表在其head
和tail
中使用了 dummy 节点,这完全没有必要,只会使类的设计复杂化。完全摆脱假人。
它没有return
。它需要返回ot
。
尝试以下方法:
SortedList::SortedList() {
//Set pointers equal to NULL
head = NULL;
tail = NULL;
theSize = 0;
}
ostream& operator<<(ostream& ot, const SortedList& sL)
{
SortedList::nodePtr temp = sL.head;
while (temp) {
ot << temp->data << " ";
temp = temp->next;
}
ot << "\n";
return ot;
}
或者,您可以使用for
循环而不是while
循环:
ostream& operator<<(ostream& ot, const SortedList& sL)
{
for(SortedList::nodePtr temp = sL.head; temp; temp = temp->next) {
ot << temp->data << " ";
}
ot << "\n";
return ot;
}
答案 1 :(得分:0)
您的运算符重载不会返回任何内容,因此它有undefined behavior。