2013-10-07 4 views
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)" ([email protected]@[email protected]) referenced in function "public: void * __thiscall ContactList::`scalar deleting destructor'(unsigned int)" ([email protected]@[email protected]) 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 
+1

Ваш код * делает * компилировать. Это не * ссылка *. Эти ошибки не так уж странны, либо (ошибки компиляции шаблона являются странными). Обучение чтению вашего компилятора и выходу вашего компоновщика является такой же частью обучения C++, как написания кода. – Johnsyweb

+0

@Johnsyweb: спасибо, я думаю, для изучения вашего компилятора требуется много времени и много практики. –

ответ

4

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

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

ContactList::~ContactList() 
{ 
} 

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

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

private: 
    unique_ptr<Contact> head; 
    int size; 
}; 
+0

Yup. Одним из бонусов использования интеллектуальных указателей является то, что нам нужно писать гораздо меньше деструкторов. – Johnsyweb

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