Уникальный указатель в связанном списке

0

Я пытался создать Связанный список, используя уникальный указатель. Однако моя программа не компилируется из-за некоторых странных ошибок, которые я не знаю, как ее исправить. Кто-нибудь, пожалуйста, помогите мне решить, как решить эту проблему? Спасибо.

ContactList.h

#pragma once
#include"Contact.h"
#include<memory>

using namespace std;

class ContactList
{
public:
    ContactList();
    ~ContactList();
    void addToHead(const std::string&);
    void PrintList();

private:
    //Contact* head;
    unique_ptr<Contact> head;
    int size;
};

ContactList.cpp

#include"ContactList.h"
#include<memory>

using namespace std;

ContactList::ContactList(): head(new Contact()), size(0)
{
}

void ContactList::addToHead(const string& name)
{
    //Contact* newOne = new Contact(name);
    unique_ptr<Contact> newOne(new Contact(name));

    if(head == 0)
    {
        head.swap(newOne);
        //head = move(newOne);
    }
    else
    {
        newOne->next.swap(head);
        head.swap(newOne);
        //newOne->next = move(head);
        //head = move(newOne);
    }
    size++;
}

void ContactList::PrintList()
{
    //Contact* tp = head;
    unique_ptr<Contact> tp(new Contact());
    tp.swap(head);
    //tp = move(head);

    while(tp != 0)
    {
        cout << *tp << endl;
        tp.swap(tp->next);
        //tp = move(tp->next);
    }
}

Это ошибки, которые у меня есть:

Error   1   error LNK2019: unresolved external symbol "public: __thiscall ContactList::~ContactList(void)" (??1ContactList@@QAE@XZ) referenced in function "public: void * __thiscall ContactList::'scalar deleting destructor'(unsigned int)" (??_GContactList@@QAEPAXI@Z) E:\Fall 2013\CPSC 131\Practice\Practice\Practice\ContactListApp.obj
Error   2   error LNK1120: 1 unresolved externals   E:\Fall 2013\CPSC 131\Practice\Practice\Debug\Practice.exe  1
Теги:
list
pointers
linked-list
unique

1 ответ

4

ContactList деструктора ContactList нет реализации.

Добавить в ContactList.cpp

ContactList::~ContactList()
{
}

Или (поскольку деструктор в любом случае тривиален), просто удалите явный деструктор из определения класса:

class ContactList
{
public:
    ContactList();
    // no explicit destructor required
    void addToHead(const std::string&);
    void PrintList();

private:
    unique_ptr<Contact> head;
    int size;
};
  • 0
    Ага. Одним из преимуществ использования умных указателей является то, что нам нужно писать гораздо меньше деструкторов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню