您好我正在尝试使用模板和ADT实现链接列表。目前我有两节课。一个是链表的迭代器,另一个是链表的基类,我将用它来从中派生链表类。
当试图实现两个函数时,我会在列表的开头和结尾给我一个迭代器,我得到编译错误,说“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
以下是节点Type
定义的代码#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
以下是linkedlist基类的定义:
#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的新手,所以试着把我的思绪包围起来。任何帮助都将非常感谢。
答案 0 :(得分:1)
你有两个标题,每个标题都试图互相包含。结果是,如果您#include "linkedlistiterator.h"
,linkedListType
的定义出现在linkedListIterator
之前;因此,由于linkedListIterator
未在此时被声明而导致错误。
在这种情况下,看起来迭代器类型根本不依赖于列表类型,因此您只需从#include "linkedlistlype.h"
中删除"linkedlistiterator.h"
。
答案 1 :(得分:1)
似乎linkedlisttype.h
和linkedlistiterator.h
互相包含。
这表明你心中的联系相当紧密。您可能希望拥有LinkedList<T>
类和嵌套LinkedList<T>::Iterator
类。