另一个内部的c ++链表

时间:2015-05-06 00:30:06

标签: c++ linked-list

我试图在另一个链接列表中创建链接列表,这是我的代码

template<typename T>
class List {
private:
    int length;
    class Node {
    public:
        T data;
        Node* next;
    } *head;

public:
    List();
    ~List();

    void insert(T item);
    void remove(T item);
    void empty();
    T* getAll();
    int count() const;       
};

template<typename T>
void List<T>::insert(T item)
{
    if (head == NULL)
    {
        head = new Node();
        head->data = item;
        head->next = NULL;
        length = 1;
        return;
    }
    Node* p = new Node();
    p->data = item;
    p->next = head;
    head = p;
    ++length;
}

struct Remainder {
    Date dt;
    List<int> notes;
};


void getDayEvents(Date dt, List<Remainder> l)
{
    Remainder* arr = new Remainder[l.count()];
    arr = l.getAll();
    for (int i = 0; i < l.count(); i++)
    {
        if (arr[i].dt.day == dt.day && arr[i].dt.month == dt.month &&              arr[i].dt.year == dt.year)
        {
            int* nArr = new int[arr[i].notes.count()];
            nArr = arr[i].notes.getAll();
            for (int j = 0; j < arr[i].notes.count(); j++)
            {
                cout << nArr[j] << endl;
            }
        }
    }
}

int _tmain() {
    Date dt1, dt2;
    dt1.setDate(17, 7, 2015);
    dt2.setDate(5, 11, 2015);

    Remainder r1, r2;
    r1.dt = dt1;
    r1.notes.insert(1);
    r1.notes.insert(2);
    r2.dt = dt2;
    r2.notes.insert(5);

    List<Remainder> l;
    l.insert(r1);
    l.insert(r2);

    getDayEvents(dt1, l);

    //----------------------------------------------------------
    int pause;
    cin >> pause;
    return 0;
}

当在列表中插入r1或r2时,每个剩余部分内的注释列表中的数据就会消失或被破坏

我不知道为什么?错误在哪里?

1 个答案:

答案 0 :(得分:3)

您按价值将对象传递到insert函数。 这意味着正在调用复制构造函数和析构函数。 您没有声明List的复制构造函数,所以可能是这样 由编译器生成,并且可能正在制作一个 复制构造函数时List的“浅”副本 Remainder的副本会复制输入Remainder的成员。

我认为这会将指针head从一个List复制到另一个List 所以现在你有 两个head个对象,其List个指针指向同一个对象。 您尚未显示Node析构函数的定义, 但是根据你在析构函数中的操作,它可能会被删除 被List被破坏的List指向另一个Node operator = 仍然有一个指向同一List的指针。

这可能听起来令人困惑,坦率地说,我不确定我能算数 正确调用构造函数和析构函数, 所以最好确保它们永远不会被不安全地使用。

一个好的开始可能是定义自己的复制构造函数和 List的{​​{1}}以新List所具有的方式 新分配的旧head中所有内容的副本。 永远不要让两个List指针指向同一个对象。 在将一个List插入另一个之后,您应该可以 在调试器中确认$ curl https://api.github.com/repos/cljsinfo/api-docs/releases/1260660/assets [ ]

的新副本