【问题标题】:"Expected class-name"...Issue in destructor implementation“预期的类名”...析构函数实现中的问题
【发布时间】:2013-01-24 12:17:06
【问题描述】:

我正在尝试实现一个堆栈和一个队列。我还获得了一个代码来测试堆栈和队列(以查看它们各自的功能是否正常工作)。

我已经实现了 stack 和 quete 的功能,但是在尝试编译它们时出现错误: 在析构函数 `Stack::~Stack()' '(' 标记之前的预期类名
在他们两个中。

下面是通用的 Stack 类:

template <class T>
class Stack
{
    List<T> list;
 public:

    Stack();

    Stack(const Stack<T>& otherStack);

   ~Stack();
}

List 类:

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

    public:

    List();

    List(const List<T>& otherList);

    ~List();
}

现在 List 类的析构函数工作得很好。所以请记住,我对析构函数的实现是:

template <class T>
Stack<T>::~Stack()
{

                 list.~List();
}

我在这里做错了什么?

【问题讨论】:

  • 不要显式调用析构函数 - 语言会为你处理。
  • 失去list.~List() 呼叫。该成员将自毁。
  • @molbdnilo,@WhozCraig 谢谢大家,现在可以使用了!

标签: c++ class linked-list stack destructor


【解决方案1】:

您应该(几乎)永远不要显式调用析构函数。当你的Stack 的生命结束时,它会自动调用其成员的析构函数。你不需要做任何事情。 list 会被自动销毁。

如果你有一个指针p,指向一个动态分配的对象作为成员,那么你需要通过delete p;在析构函数中做一些清理工作。但在这里,你没有。 list 会被自动销毁。

【讨论】:

  • @WhozCraig 添加了“几乎”。 :D
  • 傻兔子 =P 真的很好的答案,顺便说一句。
  • Nitpick:list 在技术上不一定具有自动存储持续时间,它与包含它的 Stack&lt;T&gt; 对象具有相同的存储持续时间。
【解决方案2】:

您的list 成员是一个自动变量。它的生命周期(调用它的构造函数和析构函数的时间)由语言管理。一旦包含对象超出范围,就会调用 List 析构函数。

也就是说,显式调用析构函数是有正当理由的(你没有,而且很少会这样做),而要真正做到这一点,你需要正确指定类型。

在你的情况下

list.~List<T>();

List 本身是一个模板,而不是一个类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2018-12-16
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多