Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

Qt/c++ Frage zu Fehler beim compilieren

Diskussion: Qt/c++ Frage zu Fehler beim compilieren im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Beschäftige mich in letzter Zeit mit Qt/c++, dazu ein Ausschnitt aus meinem derzeitigen "Project", bei dem ich den Fehler ...

Like Tree2Likes
  • 1 Post By lookshe
  • 1 Post By bad_alloc

Antwort
Alt 17.08.11, 15:30   #1 (permalink)
 
Registriert seit: 09.07.11
Snow! Leistung: Facit NTK
Likes: 0
Thumbs up Qt/c++ Frage zu Fehler beim compilieren

Anzeige

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!
Snow! ist offline   Mit Zitat antworten
Alt 17.08.11, 15:38   #2 (permalink)
Senior Member
 
Benutzerbild von lookshe
 
Registriert seit: 10.03.07
lookshe Leistung: 8086
Likes: 19
Standard

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.
Snow! likes this.
lookshe ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 17.08.11, 15:41   #3 (permalink)
 
Benutzerbild von bad_alloc
 
Registriert seit: 27.12.07
bad_alloc Leistung: 8086
Likes: 39
Standard

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.
Snow! likes this.
__________________
You shoot yourself in somebody else's foot.|Dann gabs da noch den Mathematiker der P?=NP in O(1) erklärte.
|[A]| = p(·,|[A]|)+1
bad_alloc ist offline   Mit Zitat antworten
Alt 17.08.11, 15:43   #4 (permalink)
Themenstarter
 
Registriert seit: 09.07.11
Snow! Leistung: Facit NTK
Likes: 0
Standard

Das wars... Die Problematik kannte ich noch nicht :/, vielen Dank.
Snow! ist offline   Mit Zitat antworten
Alt 17.08.11, 16:05   #5 (permalink)
 
Registriert seit: 06.06.09
Thunderb0lt Leistung: 8086
Likes: 6
Standard

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.
__________________
A good programmer looks both ways before crossing a one-way street.

Die Politik kann uns nur für so dumm verkaufen, wie wir sind.

Geändert von Thunderb0lt (17.08.11 um 16:07 Uhr)
Thunderb0lt ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Qt/c++ Frage zu Fehler beim compilieren
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61