Header files



  • Ich versuche gerade mein erstes größeres Projekt mit Qt zu schreiben und habe wohl ein Problem beim Einbinden der Header files.
    Jedenfalls bekomme ich ständig eine Fehlermeldung dieser Art, je nach dem wo ich die .h-files includiere.

    In file included from ship.h:9,
                     from fleet.h:7,
                     from player.h:6,
                     from battleship.h:5,
                     from battleship.cpp:1:
    boxbutton.h:21: error: syntax error before `*' token
    make: *** [battleship.o] Error 1
    

    Meine Headerfiles haben am Anfang und Ende jeweils dieses:

    #ifndef SHIP_H
    #define SHIP_H
       ...
    #endif
    

    Dem Headerfile dementsprechend angepasst natürlich.

    Ich hab nun glaub wirklich schon fast alle Kombinationen ausprobiert und auch im Web schon gesucht (aber da findet man zu "include" nur allen anderen Mist).

    Hat mir jemand vielleicht eine Seite oder einen Tipp wie man die #includes sinnvoll benutzt?



  • also ich interpretiere diese fehlermeldung folgendermaßen:

    Du hast in der Datei "boxbutton.h" in Linie 21 einen Syntaxfehler vor dem "*" Zeichen.



  • Weis auch nicht wieso die Fehlermeldung so seltsam ist. Es ist jedoch kein Syntaxfehler.
    Der Fehler liegt eher daran, dass zwei .h files sich gegenseitig benötigen und irgendwie kommt daher der Mist.



  • Gib mal den Quelltext der "boxbutton.h". Vorallem Linie 21. Da steht doch ganz klar in der Meldung, dass dort ein Syntaxfehler ist. Testweise kannst du diese Linie vielleicht auch mal auskommentieren und dann kompilieren.



  • Ich kann auch nur raten, du solltest mehr Code / Infos geben. Ein Minimalbeispiel ist immer gut.

    Versuch mal in boxbutton.h die battleship.h anstatt der battleship.cpp zu inkludieren.



  • Das Problem ist eigentlich ein anderes und es kann sein, dass es vielleicht garnicht möglich ist, ich möchte es mal so darstellen:

    //main.cpp
    #include "a.h"
    #include "b.h"
    
    int main( int argc, char **argv )
    {
    	A a;
    	B b;
    
    	return 0;
    }
    
    //a.h
    #ifndef A_H
    #define A_H
    
    #include "b.h"
    
    class A
    {
    public:
    	A();	// Konstruktor
    	B b;
    	int i;
    };
    #endif
    
    //b.h
    #ifndef B_H
    #define B_H
    
    #include "a.h"
    
    class B
    {
    public:
    	B();	// Konstruktor
    	//A a;
    	int i;
    };
    #endif
    

    Das ist ein Henne-Ei Problem.
    A braucht B und umgekehrt.
    Gibt es dafür eine Lösung oder versuche ich die ganze Zeit irgend etwas zu machen was garnicht möglich ist?


  • Mod

    ich nehme an, du willst das auskommentierte wegnehmen, dann:

    A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A enthält ein B enthält ein A ... nein, dafür gibt es keine lösung.



  • Was spricht dagegen, in "b.h" eine Forward-Deklaration mittels

    class A;
    

    zu benutzen und in der Klassendefiniton einen Zeiger-auf-A (A*) zu nehmen, der im Konstruktor von B() (in ÜE definiert, die "b.h" nun includiert) mit new initialisiert wird? Natürlich wieder brav delete aufrufen im Destuktor anschließend..

    Ist das unschön?



  • Ob das unschön ist darf diskutiert werden, jedenfalls geht es in dem Fall garnicht anders 😉

    (Eine Referenz kann man mit Forward-Decl auch nutzen, aber das hilft hier nicht besonders)


Anmelden zum Antworten