0

演習として2つのキューを使用してスタックを実装しています。スタッククラスのすべてのインスタンスに2つのキューオブジェクトがあります。スタックのデストラクタにキューのデストラクタを呼び出してもらいたいのですが。オンラインで見ると、デストラクタは自動的に呼び出される傾向があるため、明示的に使用することはあまり一般的ではないようです。私のコード:

template<class T>
class Stack {
// LIFO objects
   public:
      Stack(int MaxStackSize = 10);
      ~Stack();

      bool IsEmpty() const {return addS.IsEmpty();}
      bool IsFull() const {return addS.getSize()==maxSize;}

      Stack<T>& Add(const T& x);
      Stack<T>& Delete(T& x);
      void Print() const;
   private:
      LinkedQueue<T> addS;
      LinkedQueue<T> delS;
      int maxSize;
};

template<class T>
Stack<T>::Stack(int MaxStackSize)
{
   maxSize = MaxStackSize;
}

template<class T>
Stack<T>::~Stack()
{
   ~addS();
   ~delS();
}

template<class T>
class LinkedQueue {
// FIFO objects
    public:
        LinkedQueue() {front = rear = 0;} // constructor
        ~LinkedQueue(); // destructor
        bool IsEmpty() const
           {return ((front) ? false : true);}
        bool IsFull() const;
        T First() const; // return first element
        T Last() const; // return last element
        LinkedQueue<T>& Add(const T& x);
        LinkedQueue<T>& Delete(T& x);
      void Print() const;  // print the queue in order
      int getSize() const;

   private:
      Node<T> *front;  // pointer to first node
      Node<T> *rear;   // pointer to last node
};

template<class T>
LinkedQueue<T>::~LinkedQueue()
{// Queue destructor.  Delete all nodes.
   Node<T> *next;
   while (front) {
      next = front->link; 
      delete front; 
      front = next;
      }
}

上記のコードを実行すると、次のエラーが発生します。

stack.h:デストラクタ内'Stack <T> ::〜Stack()[with T = int]':stackrunner.cc:9:ここからインスタンス化stack.h:37:エラー:'(LinkedQueueへの呼び出しに一致しません<int>)()'</ p>

デストラクタを間違って呼び出していますか?デストラクタをまったく呼び出さないでください。クラスデストラクタが呼び出されると、オブジェクトデストラクタは自動的に呼び出されますか?

4

1 に答える 1

4

デストラクタが自動的に呼び出されます。

すでに破棄されているオブジェクトでデストラクタを呼び出すことは、未定義動作です。クラッシュしたり、恣意的な結果を招いたり、実際に損害を与えたりする可能性があります。

原則として、デストラクタを明示的に呼び出さないでください(既存のストレージにオブジェクトを構築するために新しい配置を使用している場合を除く)。

于 2012-11-05T23:37:13.870 に答える