4

スタックとキューを実装しようとしています。また、スタックとキューの両方をテストするためのコードも提供されています(それぞれの機能が正しく機能するかどうかを確認するため)。

スタックと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();
}

私はここで何が間違っているのですか?

4

2 に答える 2

7

(ほとんど)デストラクタを明示的に呼び出さないでください。あなたStackの人生が終わると、それは自動的にそのメンバーのデストラクタを呼び出します。何もする必要はありません。list自動的に破棄されます。

pメンバーとして動的に割り当てられたオブジェクトへのポインタがある場合は、を実行してデストラクタでクリーンアップ実行する必要がありますdelete p;。しかし、ここでは、あなたはしません。list自動的に破棄されます。

于 2013-02-08T16:59:18.127 に答える
5

メンバーlistは自動変数です。その存続期間(コンストラクタとデストラクタが呼び出される時間)は、言語によって管理されます。含まれているオブジェクトがスコープ外になるとすぐに、Listデストラクタが呼び出されます。

とはいえ、デストラクタを明示的に呼び出すのには正当な理由があり(デストラクタはなく、めったに呼び出されません)、実際に呼び出すには、タイプを正しく指定する必要があります。

あなたの場合、それは

list.~List<T>();

Listそれ自体はテンプレートであり、タイプではありません。

于 2013-02-08T17:02:11.790 に答える