Qt/c++ Frage zu Fehler beim compilieren

Beschäftige mich in letzter Zeit mit Qt/c++, dazu ein Ausschnitt aus meinem derzeitigen "Project", bei dem ich den Fehler leider nicht finden kann :(. Vielleicht kann mir hier wer weiterhelfen.

Code:
In file included from DestHostList.h:13:0,
                 from DestHostList.cpp:8:
ListManager.h:21:8: error: ‘DestHostList’ was not declared in this scope
ListManager.h:21:22: error: template argument 1 is invalid
make: *** [DestHostList.o] Fehler 1
snow@host:~/Code/FtpSplitter/FtpSplitter$ 



/*
 * ListManager.h
 *
 *  Created on: 17.08.2011
 *      Author: snow
 */

#ifndef LISTMANAGER_H_
#define LISTMANAGER_H_
#include "DestHostList.h"
#include "Host.h"
#include "HostManager.h"
#include "FtpSplitterMainWindow.h"
#include <QtGui>
#include <QFile>
#include <QList>

class ListManager {

private:
    QList<DestHostList*> destHosts;
    HostManager *serverList;
    QFile file;
    int ListCount;


public:
    ListManager(HostManager *sL);
    virtual ~ListManager();


    void save();
    void load();
};

#endif /* LISTMANAGER_H_ */




/*
 * DestHostList.h
 *
 *  Created on: 17.08.2011
 *      Author: snow
 */

#ifndef DESTHOSTLIST_H_
#define DESTHOSTLIST_H_
#include <QtGui>
#include "Host.h"
#include "HostManager.h"
#include "ListManager.h"


class DestHostList {

private:
    QString ListHandle;
    QString ListDirName;
    QList<Host*> list;
    QStringList HostHandles;
    HostManager *serverList;


public:
    DestHostList(HostManager *sL);
    ~DestHostList();

    void setListHandle(const QString& lh){ ListHandle = lh;}
    void setListDirName(const QString& ldn){ ListDirName = ldn;}
    void setHostHandles(const QStringList& hh){ HostHandles = hh;}

    QStringList& getHostHandles(){ return HostHandles;}
    const QString& getListHandle() const{ return ListHandle;}
    const QString& getListDirName() const{ return ListDirName;}

    void add(const QString& str);
    Host* operator[](int i);

    void update();
};


QDataStream& operator<<(QDataStream& stream, DestHostList& list);
QDataStream& operator>>(QDataStream& stream, DestHostList& list);

#endif /* DESTHOSTLIST_H_ */


Hier noch die project-file FtpSplitter.pro:

######################################################################
# Automatically generated by qmake (2.01a) Mi. Aug 17 15:06:07 2011
######################################################################

TEMPLATE = app
TARGET = 
DEPENDPATH += .
INCLUDEPATH += .
QT+=network
# Input
HEADERS += ChangeHostDialog.h \
           DestHostList.h \
           FtpHostInfo.h \
           FtpSplitterMainWindow.h \
           Host.h \
           HostManager.h \
           ListDialog.h \
           ListManager.h \
           ServerDialog.h
SOURCES += ChangeHostDialog.cpp \
           DestHostList.cpp \
           FtpHostInfo.cpp \
           FtpSplitterMainWindow.cpp \
           Host.cpp \
           HostManager.cpp \
           ListDialog.cpp \
           ListManager.cpp \
           main.cpp \
           ServerDialog.cpp
mfg snow!
 
Die Dateien ListManager.h und DestHostList.h inkludieren sich gegenseitig und da der Compiler dies nicht unendlich auflöst (wegen dem #ifndef), sondern genau einmal, kennt der eine Include die Klasse noch nicht.
Abhilfe schafft eine einfache Vorwärtsdeklaration der betroffenen Klassen.
Also vor der Definition der Klasse ListManager einfach ein
Code:
class DestHostList;
und vor der Definition von Klasse DestHostList ein
Code:
class ListManager;
und alles sollte funktionieren.
 
Du hast einen Ringschluss beim Einbinden von Headern via #include: ListManager.h bindet DestHostList.h ein und dieses wiederum ListManager.h. Probier daher mal folgendes:
Code:
class DestHostList; //Vorwärtsdeklaration
class ListManager {
private:
    QList<DestHostList*> destHosts;

EDIT: Hm, lookshe war schneller.
 
Wenn ich das richtig sehe, dann steht in DestHostList.h kein Code, der es erfordert, dass du dort ListManager.h includierst. Du kannst (bzw. solltest) dieses include (und auch die forward declaration) also entfernen.

In ListManager.h wiederum verwendest du nur einen Zeiger auf DestHostList, wodurch die komplette Klasse hier gar nicht bekannt sein muss. Der include für DestHostList.h ist also auch nicht nötig und eine reine forward declaration würde genügen.

Der Vorteil hinter dem Entfernen der Includes wäre dann, dass du die Abhängigkeiten zwischen den einzelnen Dateien zur Kompilezeit minimierst und somit (zumindest bei größeren Projekten) die zum Neukompilieren benötigte Zeit senkst.
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben