При использовании operator << происходит сбой простой программы на C ++ - PullRequest
0 голосов
/ 10 мая 2018

Во-первых, вот код ...

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 голосов
/ 10 мая 2018

Исправлен оператор << (). Однако я не проверял это, потому что List :: add () не указан в вопросе. </p>

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

Я также рекомендую изменить определение узла следующим образом:

struct Node{
    int value;
    Node *next;
    Node(int data)
        : value{data}
        , next{nullptr}
    {} 
};

Добавление одного списка к другому - оператор more + = '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;
}
...