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;
}
}
答案 0 :(得分:1)
如果List
和Stack
具有通常的语义,则构造函数会反转构造对象中项的顺序。因此,您应该以相反的顺序遍历列表,或者执行此类复制两次以恢复原始顺序。也可以使用赋值运算符和
List
this.list = otherStack.list
就够了。但是没有看到我无法分辨的List
代码。
答案 1 :(得分:0)
假设list
是Stack
的唯一成员(因为它足够了),并且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
(或更好地说:用list
的列表初始化otherStack
)足以复制整个堆栈:
template <class T>
Stack<T>::Stack(const Stack<T>& otherStack) :
list (otherStack.list) // <--- list is copied
{
}
这可能只是将问题“移动”到List
的复制结构。
答案 2 :(得分:-1)
代码片段不足以识别问题。 例如,行:
List<T> the=otherStack.list;
制作列表的副本,如果链接列表实现是自定义的,则其复制构造函数可能存在问题。 尝试
List<T> &the=otherStack.list;