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 zugriff

    benutze 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 zugriff

    Du 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 geschrieben

    class 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;


Log in to reply