"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äß abgeschlossenDie 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 mehrAllerdings 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 nichtDas 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