Привет я пытаюсь реализовать связанный список, используя шаблоны и ADT. На данный момент у меня есть два класса. Один является итератором для связанного списка, а другой — базовым классом для связанных списков, который я буду использовать для получения классов связанных списков.
При попытке реализовать две функции, которые будут давать мне итератор в начале и конце списка соответственно, я получаю сообщение об ошибке компиляции, говорящее «ISO C ++ запрещает объявление объекта« relatedListIterator »без типа»
Вот код для определения итератора:
#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, поэтому пытаюсь обдумать это. Любая помощь будет оценена, пожалуйста.
У вас есть два заголовка, каждый из которых пытается включить друг друга. В результате, если вы #include "linkedlistiterator.h"
определение linkedListType
появляется до того из linkedListIterator
; следовательно ошибка из-за linkedListIterator
не быть объявленным в тот момент.
В этом случае, похоже, что тип итератора вообще не зависит от типа списка, поэтому вы можете просто удалить #include "linkedlistlype.h"
от "linkedlistiterator.h"
,
Кажется что оба linkedlisttype.h
а также linkedlistiterator.h
включать друг друга.
Это указывает на довольно тесную связь в вашем уме. Вы, вероятно, хотите иметь LinkedList<T>
класс и вложенный LinkedList<T>::Iterator
учебный класс.