C++ &引用;应为类名“…”;。。。析构函数实现中的问题
我正在尝试实现一个堆栈和一个队列。我还提供了一个测试堆栈和队列的代码(以查看它们各自的函数是否正常工作) 我已经实现了stack和quete的函数,但是在尝试编译它们时,我得到了错误: 在析构函数“Stack::~Stack()”中 在“(”标记之前应为类名C++ &引用;应为类名“…”;。。。析构函数实现中的问题,c++,class,linked-list,stack,destructor,C++,Class,Linked List,Stack,Destructor,我正在尝试实现一个堆栈和一个队列。我还提供了一个测试堆栈和队列的代码(以查看它们各自的函数是否正常工作) 我已经实现了stack和quete的函数,但是在尝试编译它们时,我得到了错误: 在析构函数“Stack::~Stack()”中 在“(”标记之前应为类名 在他们两人身上 以下是通用堆栈类: template <class T> class Stack { List<T> list; public: Stack(); Stack(const
在他们两人身上 以下是通用堆栈类:
template <class T>
class Stack
{
List<T> list;
public:
Stack();
Stack(const Stack<T>& otherStack);
~Stack();
}
模板
类堆栈
{
名单;
公众:
堆栈();
堆栈(常量堆栈和其他堆栈);
~Stack();
}
列表类:
template <class T>
class List
{
ListItem<T> *head;
public:
List();
List(const List<T>& otherList);
~List();
}
模板
班级名单
{
列表项目*标题;
公众:
List();
列表(常量列表和其他列表);
~List();
}
现在List类的析构函数工作正常。请记住,我对析构函数的实现是:
template <class T>
Stack<T>::~Stack()
{
list.~List();
}
模板
堆栈::~Stack()
{
list.~list();
}
我做错了什么?您不应该(几乎)明确地调用析构函数。当您的堆栈的生命结束时,它将自动调用其成员的析构函数。您不需要做任何事情。列表将自动销毁
如果您有一个指针,p
,指向作为成员的动态分配对象,那么您需要通过执行delete p;
在析构函数中进行一些清理。但是在这里,您没有。list
将自动销毁。您的list
成员是一个自动变量。它的生存期(调用其构造函数和析构函数的时间)由语言管理。一旦包含的对象超出范围,就会调用列表
析构函数
这就是说,显式调用析构函数(您没有析构函数,也很少有析构函数)是有充分理由的,要真正做到这一点,您需要正确指定类型
在你的情况下,那就是
list.~List<T>();
list.~list();
List
本身是一个模板,而不是一种类型。不要显式调用析构函数-语言会为您解决这个问题。丢失List.~List()
调用。该成员将自毁。@molbdnilo,@WhozCraig谢谢大家,它现在可以工作了!@WhozCraig添加了一个“几乎”:DSilly rabbit=P非常好的答案,顺便说一句。吹毛求疵:list
在技术上不一定具有自动存储持续时间,它与包含它的堆栈
对象具有相同的存储持续时间。