Problem mit Mehrfachdeklaration
-
Ich hab mehrere Forms, die alle eine Classes.hpp includieren. Außerdem gibt es noch eine Member.hpp! In der Classes.hpp sind logischerweise nur Klassen deklariert, in der Member.hpp die dazugehörigebn Member!
Die Classes.hpp sieht ungefähr so aus:
#ifndef CLASSES #define CLASSES 100 class A{ private: int Zahl; AnsiString Text; public: int GetZahl(void); AnsiString GetText(void); } class B{ ... } ... #endif #include "Member.hpp"
Die Member.hpp demnach:
AnsiString A::GetText(void){ return Text; } int A::GetZahl(void){ return Zahl; } ...
Jede Form includiert so nur die Classes.hpp! Solange nur eine Form includiert geht auch alles gut, sobald jedoch mehrere Forms Classes.hpp includieren, bekomme ich für jeden AnsiString in der Deklaration einer Klasses in Classes.hpp Sachen wie
[C++ Error] Classes.hpp(35): E2303 Type name expected [C++ Error] Classes.hpp(35): E2139 Declaration missing [C++ Error] Classes.hpp(38): E2303 Type name expected [C++ Error] Classes.hpp(38): E2238 Multiple declaration for 'TBuyScript::AnsiString' [C++ Error] Classes.hpp(35): E2344 Earlier declaration of 'TBuyScript::AnsiString'
Ich blicke gerade nicht so ganz warum. Eigentlich habe ich doch mit #ifndef einen Schutz gegen Mehrfachdeklarationen. Und warum nur bei AnsiString und nie bei membern oder ints oder so.. ???
-
Hallo,
Hat deine Member.hpp auch Includeguards ? Wenn nicht kann die ja mehrfach eingebunden werden (wird hinter dem endif inkludiert).
Den Sinn deiner Aufteilung von Klassen und deren Member in unterschiedliche Headerdateien verstehe ich auch nicht ganz. Normalerweise sind die immer schön zusammen (ist auch übersichtlicher) im Header bzw. der zugehörigen cpp. Eigentlich packt man die Klassen in seperate Dateien.Ciao
-
Ich habe sowohl schon probiert die Member.hpp ebenfalls mit #ifndef/#endif zu versehen, als auch #include "Meber.hpp" in Classes.hpp in den #ifndef/#endif-Block zu nehmen. Bringt beides nichts.
Die ganze Haeder Hirachie ist zugegeben nicht so ganz das gelbe vom Ei, aber ich hab irgendwie keine bessere Idee. Ich will die Klassen in einer extra Datei deklarieren und weder Member, noch Klassen in den cpps der Forms packen.
-
Merke: Definition in .h oder .hpp und Deklaration in .cpp alles andere ist Bullshit und führt zu solchen Fehlern, bei denen keiner mehr durchsteigt.
classes.hpp:
#ifndef CLASSES #define CLASSES class A{ private: int Zahl; AnsiString Text; public: int GetZahl(void); AnsiString GetText(void); } class B{ ... } #endif
classes.cpp
#include <vcl.h> // damit AnsiString bekannt ist #include "classes.hpp" ... AnsiString A::GetText(void){ return Text; } ...
Unit1.cpp (.cpp der Form)
#include <vcl.h> ... #include "classes.hpp" ...
-
Ok, ich werd's testen. Mal sehen... das klingt auf jeden Fall einleuchtender, als mein spagetti-including!
-
@Killing me softly
Das mit Deklaration und Definition hast du hier wohl verwechselt.
siehe auch hier http://www.c-plusplus.net/forum/viewtopic.php?t=61231
Ansosnsten hast du natürlich recht. Wobei man, wenn es ausschliesslich um AnsiStrings geht, auch mit dem Include von dstring.h auskommen sollte.Ciao
-
Autsch, wie peinlich. Hast natürlich recht