首先,这是代码......
class List{
friend std::ostream& operator<<(std::ostream &, List&);
struct Node{
int value;
Node *next;
Node(int data) : value(data) {}
};
Node *head;
Node *tail;
unsigned int sizeList;
List operator+(List &mergeList){
Node *n = head;
if(this->sizeList != 0 && mergeList.sizeList != 0){
while(this->sizeList != 0){
mergeList.add(head->value);
n = n->next;
this->remove();
sizeList--;
}
} else if(this->sizeList == 0){
return mergeList;
} else{
return *this;
}
return mergeList;
}
std::ostream & operator <<(std::ostream & out, List & ll) {
if(ll.sizeList != 0){
for(int i; i < ll.sizeList; i++){
out << ll.head->value << " ";
ll.head = ll.head->next;
}
} else {
out << "List is empty!" << std::endl;
}
return out;
}
};
这是一个方向列表。在主题中,我的程序在使用<<
运算符(内存泄漏?)后崩溃了。以下是输入和输出描述:
int main(){
List l1;
List l2;
List l3;
std::cout << l1;
l1.add(123);
l2.add(456);
std::cout << l1;
l3 = l1 + l2;
return 0;
}
该代码有效,并且我得到了输出:
"List is empty!"
123
但是当我评论一些行时,我的代码看起来像:
int main(){
List l1;
List l2;
List l3;
std::cout << l1;
l1.add(123);
l2.add(456);
std::cout << l1;
//l3 = l1 + l2;
return 0;
}
仅返回:"List is empty!"
有人可以帮我吗?我真的不知道是什么导致了这个问题,以及如何解决它。
答案 0 :(得分:0)
固定运算符&lt;&lt; ()。 但是,我没有测试它,因为问题中没有提供List :: add()。
std::ostream & operator <<(std::ostream& out, const List & ll) {
List::Node* node = ll.head;
if (!node)
{
out << "List is empty!" << std::endl;
return out;
}
out << node->value;
node = node->next;
while (node)
{
out << ", " << node->value;
node = node->next;
}
return out;
}
我还建议按如下方式更改Node的定义:
struct Node{
int value;
Node *next;
Node(int data)
: value{data}
, next{nullptr}
{}
};
将一个列表附加到另一个列表是更多运算符+ ='ish
List& operator+=(const List &mergeList){
Node *n = mergeList.head;
while (n)
{
add(n->value);
n = n->next;
}
return *this;
}
void add(int);
好吧,我很少编写输入操作符,但我试一试:
std::istream& operator>>(std::istream& in, List& ll)
{
auto f = in.setf(std::ios::skipws);
int i;
in >> i;
ll.add(i);
while (in.good() && !in.eof())
{
int c = in.peek();
while (c == ' ' || c == ',')
{
in.get();
c = in.peek();
}
if (c == '\n')
{
break;
}
in >> i;
ll.add(i);
}
in.flags(f);
return in;
}