したがって、2つのクラスがあります。1つは抽象クラスで、もう1つはそうではありません。
抽象クラスはIteratorであり、具象クラスはLinkedListIteratorです。両方のコードは投稿の下部にあります。
私が抱えている問題は、以下のコードにあります。デストラクタの最後の行にあるLinkedListIteratorで1つのエラーが発生します。
undefined reference to `Iterator<int>::~Iterator()'
ここで、仮想の〜Iterator()デストラクタをコメントアウトしようとしましたが、エラーは発生しませんでしたが、次のような警告が表示されます。
Class '[C@800c1' has virtual method 'remove' but non-virtual destructor
だから私の質問は:抽象イテレータ基本クラスに仮想デストラクタが必要ですか?常に1つある必要があることを読みましたが、この場合、LinkedListIteratorのデストラクタは値を設定するだけで、何も解放しません...
ありがとう!
イテレータコード:
template<class T>
class Iterator {
public:
//~Constructors/Destructors------------//
/*
* Destroys necessary resources.
*/
virtual ~Iterator() = 0;
//~Methods-------------------//
/*
* Informs the user whether there are more elements to be iterated
* over in a List.
*
* @return true if there are more elements to iterate over, false otherwise.
*/
virtual bool hasNext() = 0;
/*
* Gets the next element to iterate over.
*
* @return the next element in the iteration.
*/
virtual T next() = 0;
/*
* Adds an element to the List being iterated over.
*
* @param element the element to add.
* @return true if successful, false otherwise.
*/
virtual bool add(T element) = 0;
/*
* Removes the element last returned by next from
* the List being iterated over.
*
* @return true if successful, false otherwise.
*/
virtual bool remove() = 0;
};
関連するLinkedListIteratorコード(これは長いクラスです):
template<class T>
class LinkedListIterator : public Iterator<T> {
private:
//~Data Fields---------------------------------//
/*
* Pointer to the node that the iterator is currently at.
*/
Node<T>* current;
/*
* Pointer to the LinkedList being iterated through.
*/
LinkedList<T>* list;
/*
* Boolean value indicating whether next has been called since
* the last remove operation.
*/
bool nextCalled;
public:
//~Constructors/Destructors------------------//
/*
* Constructor for LinkedListIterator, takes in a pointer to a Node
* to initialize current to point to (intended to be the head of the
* the LinkedList).
*
* @param theList pointer to the LinkedList being iterated through.
*/
LinkedListIterator(LinkedList<T>* theList) {
current = theList->head;
list = theList;
nextCalled = false;
}
/*
* Destructor, resets pointer values to 0.
*/
~LinkedListIterator() {
current = 0;
list = 0;
}