0

こんにちは、テンプレートと ADT を使用してリンク リストを実装しようとしています。現在、私は2つのクラスを持っています。1 つはリンク リストの反復子で、もう 1 つはリンク リスト クラスの派生元として使用するリンク リストの基本クラスです。

リストの最初と最後にそれぞれ反復子を与える 2 つの関数を実装しようとすると、「ISO C++ はタイプのない 'linkedListIterator' の宣言を禁止しています」というコンパイル エラーが発生します。

イテレータの定義のコードは次のとおりです。

#ifndef LINKEDLISTITERATOR_H
#define LINKEDLISTITERATOR_H

#include <stddef.h> //for NULL
#include "nodetype.h"
#include "linkedlisttype.h"


template <class Type>
class linkedListIterator
{
public:
    linkedListIterator();

    linkedListIterator(nodeType<Type> *ptr);

    Type operator*();

    linkedListIterator<Type> operator++();

    bool operator==(const linkedListIterator<Type>& right) const;

    bool operator!=(const linkedListIterator<Type>& right) const;

private:
    nodeType<Type> *current; 
};

#endif // LINKEDLISTITERATOR_H

ノード タイプの定義のコードは次のとおりです。

#ifndef NODETYPE_H_INCLUDED
#define NODETYPE_H_INCLUDED

//Definition of the node
template <class Type>
struct nodeType
{
    Type info;
    nodeType<Type> *link;
};

#endif // NODETYPE_H_INCLUDED

リンクリスト基本クラスの定義は次のとおりです。

#ifndef LINKEDLISTTYPE_H
#define LINKEDLISTTYPE_H

#include "nodetype.h"
#include "linkedlistiterator.h"

//Definition of linked list
template <class Type>
class linkedListType
{
public:
    const linkedListType<Type>& operator=
    (const linkedListType<Type>&);

    void initializeList();

    bool isEmptyList() const;

    void print() const;

    int length() const;

    void destroyList();

    Type front() const;

    Type back() const;

    virtual bool search(const Type& searchItem) const = 0;

    virtual void insertFirst(const Type& newItem) = 0;

    virtual void insertLast(const Type& newItem) = 0;

    virtual void deleteNode(const Type& deleteItem) = 0;

    // this is where the error comes    
    linkedListIterator<Type> begin();

    // and here as well
    linkedListIterator<Type> end();

    linkedListType();

    linkedListType(const linkedListType<Type>& otherList);

    ~linkedListType();

protected:
    int count; 
    nodeType<Type> *first; 
    nodeType<Type> *last; 

private:
    void copyList(const linkedListType<Type>& otherList);
};

#endif // LINKEDLISTTYPE_H

私はテンプレートと ADT に慣れていないので、これに気を配ろうとしています。どんな助けでも大歓迎です。

4

2 に答える 2

1

それぞれがお互いを含めようとする 2 つのヘッダーがあります。その結果#include "linkedlistiterator.h"、 の定義が の定義のlinkedListType前に表示されlinkedListIteratorます。linkedListIteratorしたがって、その時点で宣言されていないためにエラーが発生します。

この場合、イテレータの型はリストの型にまったく依存していないように見えるので、単に#include "linkedlistlype.h"fromを削除できます"linkedlistiterator.h"

于 2012-09-06T10:39:40.967 に答える
1

linkedlisttype.hとの両方がlinkedlistiterator.h含まれているようです。

それはあなたの心の中でかなり密接な結合を示しています。おそらく、LinkedList<T>クラスとネストされたクラスが必要LinkedList<T>::Iteratorです。

于 2012-09-06T10:40:39.093 に答える