2013-02-09 2 views
-3

복사 생성자를 만드는 데 문제가 있습니다. 나는이 문제를 구글이 // list.cpp이중 연결 목록의 복사 생성자

template <class T> 
List<T>::List() 
{ 
    head=NULL; 
} 
template <class T> 
List<T>::~List() 
{ 
} 
template <class T> 
List<T>::List(const List<T>& otherList) 
{ 
} 

에서

List.h

template <class T> 
struct ListNode 
{ 
    T value; 
    ListNode<T> *next; 
    ListNode<T> *prev; 

    ListNode(T theVal) 
    { 
     this->value = theVal; 
     this->next = NULL; 
     this->prev = NULL; 
    } 
}; 

template <class T> 
class List 
{ 
    ListNode<T> *head; 

public: 
    List(); 
    List(const List<T>& otherList); // Copy Constructor. 
    ~List(); 
    }; 

에서 : 아래 코드를 살펴 보자. 개념은 간단합니다. 새 머리글을 만들고 해당 노드에 이전 목록 노드의 // 값을 할당합니다. // 다음과 같이 시도했습니다.

ListNode<T> *old = head; // pointer to old list. 
ListNode<T> *new;// pointer to new head. 

while (old->next!=NULL){ 
new->value = old->value; 
old = old->next; 
} 

// 유일한 문제는 내 새 복사 된 목록을 가리키는 새 머리를 만드는 것입니다.

답변

1

이 전체 질문은 명확하지 않으며 쓸모없는 소멸자를 포함하여 코드에 많은 문제가 있으며 복사 할당 연산자가 아닙니다.

일반적으로 .cpp 파일에 템플릿을 정의 할 수 없으므로 전체 템플릿 정의는 코드의 모든 사용자에게 표시되어야합니다. 일반적으로이 템플릿은 헤더 파일에 전체 템플릿을 정의하는 것을 의미합니다.

ListNode<T> *new;// pointer to new head. 

new은 C++에서 키워드이므로 변수 이름으로 사용할 수 없습니다.

// 유일한 문제는 새 복사 된 목록을 가리키는 새 머리를 만드는 것입니다.

복사 된 목록은 무엇입니까? 실제로 아무것도 복사하지 않았거나 새로운 노드를 만들지 않았습니다.

당신은 내가 말하고 모두가 새로운 목록 (즉, 이전 목록의 요소를 포함 할 것) 당신이에 머리를 정의해야하는 것입니다 otherList

template <class T> 
List<T>::List(const List<T>& otherList) 
{ 
    ListNode<T>* node = otherList.head; 
    ListNode<T>** tail = &head; 
    while (node) 
    { 
    *tail = new ListNode<T>(node->value); 
    tail = &tail->next; 
    node = node->next; 
    } 
} 
+0

의 노드의 사본을 작성해야 newList. 어떻게 그럴 수 있니? ListNode * head = 새 ListItem 또는 what ????? – CerebralGarcon

+2

아니요, 로컬 변수를 선언 하겠지만 'head'멤버에 할당하려고합니다. 나는 대답을 편집했다. 어쩌면 C++에 관한 책을 구해야하고 링크 된 목록에 대해 걱정하기 전에 객체를 만드는 기본 사항을 이해해야합니다. –