-5
template <class T>
Stack<T>::Stack(const Stack<T>& otherStack)
{
        List<T> the=otherStack.list;
        ListItem<T> *temp=the.getHead();
        while(temp!=NULL)
        {
                push(temp->value);
                temp=temp->next;
        }
}

我正在使用链表制作堆栈,但我的复制构造函数不起作用。请有人帮忙。

的复制构造函数List<T>定义为:

template <class T>
List<T>::List(const List<T>& otherList)
{
    head=NULL;
    ListItem<T> *temp=otherList.head;

    while (temp!=NULL)
    {
        insertAtTail(temp->value);
        temp=temp->next;
    }
}
4

3 回答 3

1

如果List并且Stack具有它们通常的语义,则您的构造函数会反转构造对象中项目的顺序。因此,您应该以相反的顺序遍历列表或进行两次这样的复制以恢复原始顺序。也List可以只用赋值运算符复制

this.list = otherStack.list

足够的。但是没有看到List我无法分辨的代码。

于 2013-02-12T14:05:28.643 回答
0

假设listStack(因为它足够了)的唯一成员,并且List已经实现了正确的复制构造函数,您当前正在复制具有第一个赋值的列表:

template <class T>
Stack<T>::Stack(const Stack<T>& otherStack)
{
        List<T> the=otherStack.list;        // <-- list is copied
        ListItem<T> *temp=the.getHead();
        while(temp!=NULL)
        {
                push(temp->value);
                temp=temp->next;
        }
}

在获取整个列表的副本后,您将该副本的元素推送到您的堆栈中。但是只需将列表复制到成员中(或者更好地说:使用 的列表进行list初始化)就足以复制整个堆栈:listotherStack

template <class T>
Stack<T>::Stack(const Stack<T>& otherStack) :
    list (otherStack.list)  // <--- list is copied
{
}

这很可能只是将问题“转移”到List.

于 2013-02-12T13:37:30.490 回答
-1

代码片段不足以识别问题。例如行:

List<T> the=otherStack.list;

制作列表的副本,如果链表实现是自定义的,则它的复制构造函数可能有问题。尝试

List<T> &the=otherStack.list;
于 2013-02-12T13:37:30.567 回答