Probleme beim Header einbinden mit Visual C++6
-
Hallo!
Mein Problem is folgendes:
Ich habe 2 Klassen geschrieben (A und B), die beide jeweils auf Variablen der anderen zugreifen müssen. Jede Klasse steht in einer eigen Source File (.cpp) und in einem eigenen Header. Wenn ich jetzt aber in den Header von A den Header von B einbinde und umgekehrt, dann meckert er immer dass eine Klasse in einem Header nicht definiert sei.
Bsp:
Header von A#ifndef A_H #define A_H #include "b.h" class A { ... }; #endif
Header von B:
#ifndef B_H #define B_H #include "a.h" class B { ... }; #endif
Warum spuckt er dann immer einen Error aus??
Wenn ich beide Header in stdafx.h einbinde geht es genausowenig
mfg Michael
-
so wie du das beschreibst baust du eine endlosschleife. a versucht b zu includen findet aber da wieder a zum includen dann wieder b includen in b wieder a ... am besten du includest beide in ein darüber stehender headerfile. am besten der headerfile der hauptklasse deines programms. programmname.h meistens
MfG ExElNeT
-
Solange Du nur Referenzen oder Zeiger verwendest kannst Du im **voraus deklarieren.
class B
class A
{
public:
void getDataFromB(const B &);};
Versuchs mal**
-
hallo miwitt001
dein ansatz war so schon richtig, nur es fehlt noch etwas. der klassenprototyp (siehe knuddlbär).
wenn man alle klassen wie folgt definiert, dann hat man eigentlich keine probleme. (man kannes aber auch gerne anders machen!)
jede klasse besteht aus 2 dateien. der header datei (.h) und der quellcode datei (.cpp). in der header datei wird NUR die KLASSE definiert nicht aber ihre methoden (ausser bei inline funktionen, die vergessen wir aber mal), und in der quellcode datei werden dann die einzelnen methoden definiert. das sieht dann wie folgt aus:
header datei:
//prototyp (deklaration), damit jeder weiss, das es die klasse gibt. class CAuto; //braucht man, damit die klasse nur einmal erstellt wird, denn der nachfolgende code ist da die definition (das erstellen der klasse) #ifndef CAUTO #define CAUTO //hier wird nur das includiert was die Klasse, aber nicht die Methoden der Klasse, braucht! #include "AllesDasWasDieKlasseBraucht.h" //die klasse selber class CAuto { public: CAuto(void) ~CAuto(void) public: void Methode1(void); void Methode2(void); private: long m_Var1; //membervariable 1 long m_Var2; //membervariable 2 }; #endif
quellcode datei:
//braucht man damit die .cpp datei weiss das es die klasse gibt, denn hier werden ja nur die mthoden der klasse definiert nicht aber die klasse selber! #include "CAuto.h" //hier kommt alles hin, was man nur IN DEN METHODEN braucht z.b. <string.h>, wenn man mit strings arbeiten möchte. das braucht die definition der klasse (.h) nicht! #include "AllesWasDieQuellcodeDateiBraucht.h" CAuto::CAuto(void) { //oder in die elementinitialisierungsliste, ich finde es sieht so aber schöner und übersichtlicher aus! m_Var1=0; m_Var2=0; } CAuto::~CAuto(void) { } void CAuto::Methode1(void) { m_Var1=1; } void CAuto::Methode2(void) { m_Var2=2; }
wenn man dann allen klassen, die man schreibt, eine eigene cpp/h datei verpasst, ist alles immer sehr übersichtlich und aufgeräumt und es gibt keine probleme beim einbinden von klassen. man muss dann nur noch überall dort wo eine klasse gebraucht wird, die header datei einbinden.
[ Dieser Beitrag wurde am 22.11.2002 um 07:07 Uhr von KXII editiert. ]
-
Ich habs jetzt so gemacht:
Header Datei A:
#include "b.h" class B; class A { A(); ~A() void Funktion1(); ... };
Header Datei B:
include "a.h" class A; class B { B(); ~B() void Funktion1(); ... };
Beim ersten mal testen, is zwar Visual C++ abgestürzt
, aber mittlerweile kompiliert er wenigstens ohne fehler. Hoffe mal Visual C++ macht das jetzt auch so, wie ich mir das vorstelle, nicht dass ich jeweils 2 Klassen habe
Danke für eure Hilfe!!
mfg Michael
-
ok
aber warum setzt du nicht einfach anststt
#include "B.h"
UND
class B;
einfach NUR ein
#include "B.h"
und setzt das 'class B;' einfach in die header datei von b.h ? das ist das selbe nur einfacher!
du machst es jetzt manuell... anders macht es die header datei für dich
cu