2015-05-06 3 views
0

Я пытаюсь сделать связанный список внутри другой, вот мой кодC++ связанный список в другой один

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 в списке, данные внутри списков нот внутри каждый остаток просто исчез или уничтожен

Я не знаю почему? Где ошибка?

+0

Вы можете показать больше вашего источника; Дата является либо классом, либо структурой и не видит никакой реализации, а для вас класса List вы также не показываете какую-либо свою реализацию. Трудно сказать, где может быть ваша ошибка. –

+0

Я добавил реализацию метода insert в списке и объявление класса даты. Вам нужна дополнительная информация? .. спасибо за помощь :) –

+0

Я отредактировал ваше оригинальное сообщение, чтобы улучшить форматирование для лучшей читаемости. Только видимый для меня, пока он не одобрен экспертной оценкой. –

ответ

3

Вы передаете свои объекты в функцию insert по значению. Это означает, что вызываются копии конструкторов и деструкторов. Вы не объявить конструктор копирования из List так что предположительно генерируется компилятором, и, предположительно, делает «мелкой» копию List, когда конструктор копирования из Remainder делает копии членов ввода Remainder.

Я думаю, что это копирует указатель head от одного к другому List , так что теперь у вас есть два List объекты, head указатели указывают на тот же объект. Вы не показали определение List деструктора, , но в зависимости от того, что вы делаете в этом деструктора это может быть удаление в Node, что уничтоженные List указывает в то время как другой List еще есть указатель на тот же Node.

Это может показаться странным, и, честно говоря, я не уверен, что могу рассчитывать на вызовы конструкторов и деструкторов корректно себя, так лучше просто убедитесь, что они никогда не могут быть использованы ненадежно.

Хороший старт может быть, чтобы определить свой собственный конструктор копирования и operator = для List таким образом, что новый List имеет вновь выделенные копии всего, что было в старом List. Никогда не позволяйте двум указателям head указывать на один и тот же объект. После того как вы вставлены один в другой List, вы должны быть в состоянии подтвердить в отладчике, что новая копия List

+0

спасибо, он решается путем определения оператора = –

Смежные вопросы