Globale deklarationen verfuegbar machen
-
Heiho
es geht darum
ich hab ein paar globale deklarationen von strukturen die ich in einer einzelnen *.h ausgelagert hab
nun moechte ich diese in verschiedenen klassen benutzen - nu die frage, wie kann ich diese bekannt machen ?
wenn ich immer nur die header einbinde kommen fehler wegen mehrfachdeklarierungen {schon bekannt blabla}wie kann ich die datei bekannt machen das die in allen klassen funktionieren ?
-
Mr Evil schrieb:
es geht darum
Echt? Ich dachte, du würdest jetzt erst mal etwas erzählen, worum es eigentlich gar nicht geht.
Mr Evil schrieb:
wenn ich immer nur die header einbinde kommen fehler wegen mehrfachdeklarierungen {schon bekannt blabla}
Includeguards vergessen? Falls nicht, genaue Fehlerbeschreibung abliefern, nicht "blabla".
-
MFK schrieb:
Includeguards vergessen? Falls nicht, genaue Fehlerbeschreibung abliefern, nicht "blabla".
includeguards ? nie gehoert
wenn ich die header in fuer die eine klasse includier ist es ok, sobald ich es aber auch in einer zweiten klasse brauch kommt:
1>OwnView.obj : error LNK2005: "struct CBIDandName * g_sElement" (?g_sElement@@3PAUCBIDandName@@A) already defined in OwnView.obj
verstaendlich da er es ja durch das includieren ein zweites mal deklarieren moechte
das soll ja nicht #gg
ich brauch diese globalen elemente in jeder klasse und auch jede muss was aendern duerfen
wenn ich es nur global in der einen cpp datei mach, bekomm ich von der anderen cpp datei darauf kein zugriffbenutze Visual Studio 2005 Prof.
/= danke
// dazuedit - ich hab grad erfahren das diese "include guards" einfach die #ifndef usw sind - diese hab ich schon lange drinn, bringt nix
-
Mr Evil schrieb:
wenn ich die header in fuer die eine klasse includier ist es ok, sobald ich es aber auch in einer zweiten klasse brauch kommt:
1>OwnView.obj : error LNK2005: "struct CBIDandName * sElement" (?g_sElement@@3PAUCBIDandName@@A) already defined in OwnView.obj
Das ist dann aber nicht nur eine Deklaration in dieser Headerdatei, sondern eine Definition, und zwar von g_sElement. Das geht nicht.
verstaendlich da er es ja durch das includieren ein zweites mal deklarieren moechte
Wie gesagt, eine Deklaration wäre in Ordnung. Du hast da eine Definition. Eine Deklaration einer Variablen bekommst mit extern. Die Definition schiebst du dann in eine cpp-Datei.
-
Im Header:
extern struct CBIDandName * g_sElement;
In einer Codedatei:
struct CBIDandName * g_sElement = ...;
-
Mr Evil schrieb:
MFK schrieb:
Includeguards vergessen? Falls nicht, genaue Fehlerbeschreibung abliefern, nicht "blabla".
includeguards ? nie gehoert
Google hilft (aber in deinem Fall sind die sowieso nicht das Problem)
ich brauch diese globalen elemente in jeder klasse und auch jede muss was aendern duerfen
wenn ich es nur global in der einen cpp datei mach, bekomm ich von der anderen cpp datei darauf kein zugriffDu benötigst reine Deklarationen im Header (
extern
) und die zugehörigen Definitionen in EINER .CPP.
-
fuck - das ist ja das problem - ich brauch auch die definition in der datei
also datei x.h beinhaltet elemente welche auch eigenschaften usw haben
diese elemente und auch diese eigenschaften brauch ich in so um die 10 weitere cpp dateien }= und jede klasse {pro cpp eine klasse} braucht auch die moeglichkeit eine eigenschaft des elements zu aendern
-
Mr Evil schrieb:
fuck - das ist ja das problem - ich brauch auch die definition in der datei
Nein, die Definition benötigst du nur EINMAL im gesamten Projekt (andernfalls wird in jeder Übersetzungseinheit eine eigene Version der Variable erzeugt - und das verwirrt nur den Linker), alle anderen Dateien benötigen lediglich eine Deklaration (die wird vom Linker dann mit der zugehörigen Definition verknüpft).
-
hmm - klingt logisch, aber ich weiss grad nicht wie ich das implementieren kann ?
es geht darum, ich brauch mehere strukturen die ueberall verfuegbar sind
da hab ich die strukturdeklaration in einer klasse und den inhalt in der *.h datei geschriebenclass Klasse { struct Struktur { UINT Element1; UINT Element2; UINT Element3; }; };
*.h
Klasse::Struktur g_Struktur[] = { IDAa, IDAb, IDAc, IDBa, IDBb, IDBc, IDCa, IDCb, IDCc, };
da stellt sich mir die frage, wie kann ich es umschreiben
wenn ich in der header
struct Struktur { UINT Element1; UINT Element2; UINT Element3; };
schreib, und in der klasse dann das andere, also genau umgekehrt, hab ich dann ueberhaupt zugriff auf das array ?
wenn ich in der header. . UINT Element3; }g_Struktur[];
mach wird er doch rummeckern da es nicht statisch ist []
-
Im Header:
extern Klasse::Structur g_Structur[3/*Groesse*/]; //ich bin mir nicht sicher, ob eine Array-Deklaration ohne Größenangabe erlaubt ist //vermutlich nicht
In der Klasse.cpp:
Klasse::Struktur g_Struktur[3] = { IDAa, IDAb, IDAc, IDBa, IDBb, IDBc, IDCa, IDCb, IDCc, };
-
das geht wo doch ?
grad mal probiert*.h
struct Struktur { UINT a; UINT b; }g_Struktur[];
a.cpp
Struktur g_Struktur[] = { 1, 1, 2, 2, };
b.cpp
void CKlasseB::Funktion() { UINT x = g_Struktur[0].a; }
kompiliert fehlerfrei #grins
danke fuer den guten schubs
-
Mr Evil schrieb:
kompiliert fehlerfrei #grins
#grins nicht zu früh. Dass der Compiler es übersetzen kann, bedeutet nicht, dass es läuft.
-
nicht nur das - auch intellisense macht was es soll - werds natuerlich testen - ich hab eine lokale kopie meines bisherigen stands {o;