使用运算符<< ,简单的C ++程序崩溃

时间:2018-05-10 17:11:46

标签: c++ linked-list operator-overloading operators

首先,这是代码......

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!"

有人可以帮我吗?我真的不知道是什么导致了这个问题,以及如何解决它。

1 个答案:

答案 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;
}