C ++ Почему мой шаблонный класс связанного списка не работает, когда я создаю объект класса, в котором есть связанный список? - PullRequest
0 голосов
/ 15 июля 2011

Я написал этот шаблонный класс LinkedList, который еще не закончен - мне еще предстоит добавить функции безопасности и дополнительные методы. На данный момент он делает то, что мне нужно. Но это не помогает в определенной ситуации, и я не знаю почему.

template<class data_type> class LinkedList {
private:
    struct Node {
    data_type data;
    Node* prev;
    Node* next;
    Node() : prev(NULL), next(NULL) {}
};
Node* head;
Node* GetLastNode() {
    Node* cur = head;
    while (cur->next != NULL)
        cur = cur->next;
    return cur;
}
public:
LinkedList() {
    head = new Node;
    head->prev = head;
    head->next = NULL;
}
LinkedList(LinkedList<data_type> &to_copy) {
    head = new Node;
    head->prev = head;
    head->next = NULL;
    for (int i = 1; i <= to_copy.NumberOfItems(); i++) {
        this->AddToList(to_copy.GetItem(i));
    }
}
~LinkedList() {
    DeleteAll();
    delete head;
    head = NULL;
}
void AddToList(const data_type data) {
    Node* last = GetLastNode();
    Node* newnode = last->next = new Node;
    newnode->prev = last;
    newnode->data = data;
}
void Delete(const unsigned int position) {
    int currentnumberofitems = NumberOfItems();
    Node* cur = head->next;
    int pos = 1;
    while (pos < position) {
        cur = cur->next;
        pos++;
    }
    cur->prev->next = cur->next;
    if (position != currentnumberofitems)
        cur->next->prev = cur->prev;
    delete cur;
}
void DeleteAll() {
    Node* last = GetLastNode();
    Node* prev = last->prev;

    while (prev != head) {
        delete last;
        last = prev;
        prev = last->prev;
    }
    head->next = NULL;
}
data_type GetItem(unsigned int item_number) {
    Node* cur = head->next;
    for (int i = 1; i < item_number; i++) {
        cur = cur->next;
    }
    return cur->data;
}
data_type* GetItemRef(unsigned int item_number) {
    Node* cur = head->next;
    for (int i = 1; i < item_number; i++) {
        cur = cur->next;
    }
    return &(cur->data);
}
int NumberOfItems() {
    int count(0);
    Node* cur = head;
    while (cur->next != NULL) {
        cur = cur->next;
        count++;
    }

    return count;
}
};

Я изложил свою проблему в вопросе, и вот пример:

class theclass {
public:
    LinkedList<int> listinclass;
};

void main() {
    LinkedList<theclass> listoftheclass;
    theclass oneclass;
    oneclass.listinclass.AddToList(5);
    listoftheclass.AddToList(oneclass);
    cout << listoftheclass.GetItem(1).listinclass.GetItem(1);
}

Я не могу понять, почему он работает неправильно.

Ответы [ 2 ]

3 голосов
/ 15 июля 2011

Вам необходимо реализовать оператор присваивания. Проблема начинается с этой функции здесь:

void AddToList(const data_type data) {
    Node* last = GetLastNode();
    Node* newnode = last->next = new Node;
    newnode->prev = last;
    newnode->data = data; <---------------------------- Right there
}

Поскольку data_type - это ваш класс, и у вас нет подходящего оператора присваивания, вы просто получаете член по его (мелкой) копии.

См. Правило Трех

Возможно, вам также следует реализовать функцию подкачки, и ваш оператор присваивания должен использовать ее.

См. Идиома копирования и обмена

2 голосов
/ 15 июля 2011

В C ++ 03 локальные классы не могут быть аргументами шаблона. Переместите theclass за пределы main, и оно будет работать.

В C ++ 0x это ограничение снято.

...