'const struct list :: SingleList'的前向声明,无效使用不完整类型'list :: SingleList'(编译错误)

Mos*_*eda 3 c++ compiler-errors

SingleList.h

#include "ListBase.h"
#include "DataNode.h"
#include "SingleListIterator.h"

namespace list
{
    class SingleListIterator;
    class SingleList : public ListBase
    {
        private:
            DataNode *head;
            DataNode *tail;
        public:
            SingleList();
            SingleList(const SingleList &obj);
            ~SingleList();
            void Flush(); //deletes all elements in the list
            void PushInFront(const int data); // **
            void Append(const int data); // **
            void DeleteLast();
            void DeleteFirst();
            int Delete(const int& data); // ** remove the first occurrence of data and return 1 otherwise 0
            const int& GetFirst() const; // **
            int& GetFirst(); // **
            const int& GetLast() const; // **
            int& GetLast(); // **
            void PrintList() const;
            const int IsEmpty() const;
    //        SingleList<T> &operator=(const SingleList<T>& obj) (**)
    //        const int operator==(const SingleList<T> &obj) const (**)
    //        const int operator!=(const SingleList<T> &obj) const (**)
    //        SingleList<T>& operator+(const SingleList<T> &obj) (**) // concatenates two lists
    //        operator int() // returns list size (**)
            friend class SingleListIterator; // ** ASK Changd it from Iterator
    };
Run Code Online (Sandbox Code Playgroud)

SingleListIterator.h

#include "Iterator.h"
#include "SingleList.h"

namespace list
{
    class SingleList;
    class SingleListIterator: public Iterator
    {
        public:
                           // error here --> Forward declaration of 'const struct list::SingleList'
            SingleListIterator(const SingleList &list); // **
            SingleListIterator(const SingleListIterator &obj); // **
            virtual const int Current() const; // **
            virtual void Succ();
            virtual const int Terminate() const;
            virtual void rewind();
    //        T &operator++(int) (**)
    //        SingleListIterator<T>& operator=(const SingleListIterator<T>&obj) (**)
    };
            // error here --> Invalid use of incomplete type 'list::SingleList'
    SingleListIterator::SingleListIterator(const SingleList &list) : Iterator(list.head)
    {
    }
Run Code Online (Sandbox Code Playgroud)

代码中指示的错误另外在这样的情况下我可以做什么,两个头文件之间存在相互耦合????? Thaaaaanks

sth*_*sth 5

您使用前向声明,但无论如何,您还是.h递归地包含这些文件.前向声明的要点是您不需要包含前向声明的类的标头,从而打破了相互依赖性.

此外,它应该足以为其中一个类使用前向声明,而不是两个类.

我会建议以下结构:

SingleListIterator.h:

class SingleList;                // forward declaration
class SingleListIterator {
   // Declarations, only using pointers/references to SingleList.
   // Definitions that need to know the structure of SingleList (like maybe
   // a constructor implementation) need to be done in the .cpp file.
};
Run Code Online (Sandbox Code Playgroud)

SingleList.h:

#include "SingleListIterator.h"  // include full declaration

class SingleList {  
   // declarations
};
Run Code Online (Sandbox Code Playgroud)

SingleListIterator.cpp:

#include "SingleListIterator.h"
#include "SingleList.h"           // include full declaration of the type
                                  // forward-declared in SingleListIterator.h

// method definitions,...
Run Code Online (Sandbox Code Playgroud)

SingleList.h:

#include "SingleList.h"            // include full declarations of everything

// definitions
Run Code Online (Sandbox Code Playgroud)

这样,没有相互包含的文件,并且所有类型在实现(.cpp)文件中都是完全已知的.