-3

我在制作复制构造函数时遇到问题。考虑下面的代码:

在 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();
    };

在 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)
{
}

//我有谷歌的问题。概念很简单。创建一个新的头并为其节点分配旧列表节点的//值。// 所以因为我已经尝试了以下。

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; 
}

// 唯一的问题是如何创建一个指向我的新复制列表的新头。

4

1 回答 1

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;
  }
}
于 2013-02-09T15:58:58.770 回答