Dreiecksinclude
-
Hallo,
ich bräuchte folgendes:// A.h #include "Bin.h" #include "Bout.h" class A { public: BinListe ListeBInput; BoutListe ListeBOutput; }; // B.h #include "A.h" class B { public: A* MyMother; }; // Bin.h #include "B.h" class Bin : public B {}; #include <map> typedef std::map<unsigned short, Bin*> BinListe; // Bout.h #include "B.h" class Bout : public B {}; #include <map> typedef std::map<unsigned short, Bout*> BoutListe;Nunja, mein Problem ist jetzt, dass ich bei den Input und Output-Klassen immer ein "Basisklasse undefiniert" für das ": public B" bekomme.
Ich weiß schon gar nicht mehr wie ich das vorrausdeklarieren soll, damit das funktioniert.
Hilfe,
Stefan
-
// A.h #include "Bin.h" #include "Bout.h" class A { public: BinListe ListeBInput; BoutListe ListeBOutput; }; // B.h class A; // Du brauchst nur einen Zeiger auf A -> Deklaration class B { public: A* MyMother; }; // Bin.h #include <map> // Includes am besten immer oben in Dateien #include "B.h" class Bin : public B {}; typedef std::map<unsigned short, Bin*> BinListe; // Bout.h #include <map> #include "B.h" class Bout : public B {}; typedef std::map<unsigned short, Bout*> BoutListe;Wenns nötig ist, kannst du auch noch:
// A.h #include <map> class Bin; class Bout; class A { public: std::map<unsigned short, Bin*> ListeBInput; std::map<unsigned short, Bout*> ListeBOutput; }; // B.h class A; // Du brauchst nur einen Zeiger auf A -> Deklaration class B { public: A* MyMother; }; // Bin.h #include <map> // Includes am besten immer oben in Dateien #include "B.h" class Bin : public B {}; typedef std::map<unsigned short, Bin*> BinListe; // Bout.h #include <map> #include "B.h" class Bout : public B {}; typedef std::map<unsigned short, Bout*> BoutListe;oder wenn du BinListe und BoutListe in mehreren Dateien brauchst:
// b_forward_declarations.h #include <map> class Bin; class Bout; typedef std::map<unsigned short, Bin*> BinListe; typedef std::map<unsigned short, Bout*> BoutListe; // A.h #include <map> #include "b_forward_declarations.h" class A { public: BinListe ListeBInput; BoutListe ListeBOutput; }; // B.h class A; // Du brauchst nur einen Zeiger auf A -> Deklaration class B { public: A* MyMother; }; // Bin.h #include <map> // Includes am besten immer oben in Dateien #include "B.h" #include "b_forward_declarations.h" class Bin : public B {}; // Bout.h #include <map> #include "B.h" #include "b_forward_declarations.h" class Bout : public B {};Aber Bin.h und Bout.h müssen B zwingend inkludieren, solange B Basisklasse ist, da dafür die Definition gebraucht wird.
-
// A.h #include "Bin.h" #include "Bout.h" class A { public: BinListe ListeBInput; BoutListe ListeBOutput; }; // B.h class A; class B { public: A* MyMother; }; #include "A.h" // Ohne den macht er es nicht. Muss unten stehen. // Bin.h #include <map> #include "B.h" class Bin : public B {}; typedef std::map<unsigned short, Bin*> BinListe; // Bout.h #include <map> #include "B.h" class Bout : public B {}; typedef std::map<unsigned short, Bout*> BoutListe;Danke schön. Eins hatte er noch (siehe Kommentar), sonst sagt er in der DLL-Verision, dass die Klasse zwar deklariert wurde, aber keine Daten da sind. Und der #include <map> stand nur unten, damit man gleich sieht, dass die Liste eine Standard-Map ist. Steht natürlich immer oben bei mir.
-
stefanjann schrieb:
Eins hatte er noch (siehe Kommentar), sonst sagt er in der DLL-Verision, dass die Klasse zwar deklariert wurde, aber keine Daten da sind.
Das sollte er eigentlich nicht tun. Gibt es keine A.cpp, die zum Projekt gehört?
Ich geh mal davon aus, dass du Include Guards hast.
BTW: Hab mein obiges Posting noch erweitert, nachdem du bereits geantwortet hast.
-
Michael E. schrieb:
stefanjann schrieb:
Eins hatte er noch (siehe Kommentar), sonst sagt er in der DLL-Verision, dass die Klasse zwar deklariert wurde, aber keine Daten da sind.
Das sollte er eigentlich nicht tun. Gibt es keine A.cpp, die zum Projekt gehört?
Nein, zum Testen gab es keine .cpp-Datei. Aber wenn es cpp-Dateien gibt, dann braucht man keinen #include, da hast du recht.
Zum erweiteren Listening: Ich hab eh eine "Declare.h" wo ich meine ganzen Typen definiere (viel typedef wegen Win und Mac kompatibel), da füg ich das noch mit ein. Das ist ne gut Idee.
Danke vielmals.
Stefan
-
stefanjann schrieb:
Michael E. schrieb:
Das sollte er eigentlich nicht tun. Gibt es keine A.cpp, die zum Projekt gehört?
Nein, zum Testen gab es keine .cpp-Datei.
Dann lag da der Fehler. Wenn die A.h nie inkludiert wurde, ist natürlich auch keine Definition von A vorhanden
Aber sobald es eine A.cpp gibt, die A.h natürlich einbindet, löst sich das Problem von alleine.