"Deadlock" in Klassendeklarationen



  • @PHPfreak
    Werf diese God-header-datei komplett weg. Inkludiere nur das was du wirklich brauchst. Versuche in Headerdateien möglichst keine anderen Headerdateien zu inkludieren.
    Wo ist denn die Foreward-Deklaration von Spieler in Controller? Welcher fehler kommt denn jetzt?



  • Braunstein schrieb:

    @PHPfreak
    Werf diese God-header-datei komplett weg. Inkludiere nur das was du wirklich brauchst. Versuche in Headerdateien möglichst keine anderen Headerdateien zu inkludieren.
    Wo ist denn die Foreward-Deklaration von Spieler in Controller? Welcher fehler kommt denn jetzt?

    Es kommt immer noch die Meldung:

    [C++ Fehler] controller.cpp(2): E2090 Qualifizierer 'Controller' ist kein Name einer Klasse oder einer Struktur
    [C++ Fehler] controller.cpp(2): E2040 Deklaration nicht ordnungsgemäß abgeschlossen

    Die Forward-Deklaration bringt leider auch nichts. Ich bin echt ratlos!

    Das mit der God-Header-Datei ist aber jetzt schon fest verankert und es wäre sehr schwer, die wieder los zu werden. Aber wenns nicht anders geht...

    Trotzdem verstehe ich nicht, warum Controller kein Name einer Klasse oder Struktur sein soll



  • Du musst in die Cpp Datei die Headers inludieren.



  • Zeus schrieb:

    Du musst in die Cpp Datei die Headers inludieren.

    Ja, jetzt komme ich der Sache schon näher. Danke!
    Der Fehler erscheint nun nicht mehr

    Allerdings habe ich jetzt doppelt definierte Konstanten (die ich in der header-Datei definiere)
    Müsste also irgendwie abfragen, ob die Datei bereits inkludiert wurde oder nicht

    Das versuche ihc einfach mal mit ifndef 🙂



  • Das gibts doch nicht!

    #ifndef CONSTS
         #define CONSTS
         static const unsigned short int CONST__anzX = 7;     //Spielfeld-Breite
         static const unsigned short int CONST__anzY = 6;     //Spielfeld-Höhe
         static const unsigned int CONST__breite_label = 60;  //Breite eines Felds
         static const unsigned int CONST__hoehe_label  = 60;  //Höhe eines Felds
         static const unsigned int CONST__abstand      = 1;   //Abstand zw. Feldern
    
         static const TColor       CONST__default_spieler1_color = clRed;    //Standartfarbe Spieler1
         static const TColor       CONST__default_spieler2_color = clLime;   //Standartfarbe Spieler2
    
         static const TColor       CONST__default_background_color = clWhite;   //Standarthintergrund
         static const TColor       CONST__default_emptyField_color = clBtnFace; //Standartfarbe Leeres Feld
    
         static const AnsiString   CONST__default_spieler1_name = "Spieler 1";  //Standartname Spieler1
         static const AnsiString   CONST__default_spieler2_name = "Spieler 2";  //Standartname Spieler2
         #endif
    

    Im if-Block werden viele Konstakten definiert. Bei den ersten 5 Konstanten meldet mir der Compiler keine Fehler, aber ab den TColors kommt:

    [C++ Fehler] __HEADERS.H(17): E2304 Konstante-Variable 'TColor' muß initialisiert sein.
    [C++ Fehler] __HEADERS.H(17): E2141 Fehler in der Deklarationssyntax
    [C++ Fehler] __HEADERS.H(18): E2238 Bezeichner 'TColor' mehrfach deklariert
    [C++ Fehler] __HEADERS.H(17): E2344 'TColor' bereits deklariert
    usw...

    Erkennt der hier TColor nicht als Typ oder wie?

    Ich werd noch verrückt hier 😃



  • PHPfreak schrieb:

    Erkennt der hier TColor nicht als Typ oder wie?

    Wie sollte er den Typ kennen? TColor ist kein C++ Standardtyp. Du musst auch den entsprechenden Header inkludieren (Glaube "#include <Classes.hpp>").

    PHPfreak schrieb:

    Ich werd noch verrückt hier 😃

    Besser du nimmst dir erst einmal ein C++ Einstiegsbuch vor, und erst danach die C++ Builder spezifischen Dinge.



  • TColor konnte ich bisher problemlos verwenden.

    Erst seit ich diese tollen cpp-Dateien verwende, geht es nicht mehr.
    Warum auf einmal?

    Und C++ an sich beherrsche ich, zumindest die Grundlagen. Mir macht der Compiler zu schaffen!



  • PHPfreak schrieb:

    Und C++ an sich beherrsche ich, zumindest die Grundlagen. Mir macht der Compiler zu schaffen!

    Nein, alles was hier angesprochen wurde, deutet auf fehlendes Verständnis der C++ Grundlagen. Dazu gehört auch warum man Code in Header und Source untergliedert, Forward-Deklaration usw. Und keiner der Fehler ist ein Problem des Compilers gewesen.



  • Benutz´ statt static extern, dann geht´s:

    .h Datei

    extern const unsigned int KONSTANTE;
    

    .cpp Datei

    const unsigned int KONSTANTE = 1;
    


  • PHPfreak schrieb:

    TColor konnte ich bisher problemlos verwenden.

    Erst seit ich diese tollen cpp-Dateien verwende, geht es nicht mehr.
    Warum auf einmal?

    Und C++ an sich beherrsche ich, zumindest die Grundlagen. Mir macht der Compiler zu schaffen!

    Definitive nicht!
    C++ Grundlagen wie
    - Include /-Guards
    - Deklaration und Definition
    beherrscht du leider nicht.

    Jeder Compiler, sei es GCC, MSVC++,... macht es dir zu schaffen.



  • Jaja, macht mich nur schön runter

    Zeit für die "Grundlagen" ist jetzt jedenfalls keine mehr. Dann muss ich halt unsauberen Code in Kauf nehmen



  • PHPfreak schrieb:

    Jaja, macht mich nur schön runter

    Erkenne dich selbst.



  • Leute!!

    Ich hab es endlich hinbekommen. Ich hatte die ganze Zeit "alles" richtig. Was gefehlt hat, war DAS:

    USEUNIT("controller.cpp");
    USEUNIT("computer.cpp");
    USEUNIT("mensch.cpp");
    USEUNIT("model_feld.cpp");
    USEUNIT("model_spielfeld.cpp");
    USEUNIT("spieler.cpp");
    

    Damn it, da muss man erstmal draufkommen

    Jaja, ich weiß.. Die Grundlagen 😉


Anmelden zum Antworten