Globale Variable



  • Hallo,

    könnt ihr mir sagen, wo und wie in meinem Projekt ich eine Variable definieren kann, die allen Klassen bekannt ist?



  • Du könntest die Variable in die CMainFrame Klasse legen. Diese kannst du dir überall ohne große Probleme mittels

    CMainFrame *p = (CMainFrame*)AfxGetMainWnd();
    

    holen.



  • Oder Singleton...



  • Alternative: Durch namespace umhüllen.

    //stdafx.h: 
    namespace Global{ extern int value; }
    
    //stdafx.cpp:
    int Global::value = 100;
    
    //OnInitDialog:
    CString str;
    str.Format("%i", Global::value);
    MessageBox(str); //Ausgabe: 100
    
    Global::value = 200;
    str.Format("%i", Global::value);
    MessageBox(str); //Ausgabe: 200
    

    Für Leute, die sich immer über diesen Linker error mit der doppelten/mehrfachen Definition ärgern, hier kann man ihn gezielt erzeugen und verstehen:

    //stdafx.h: 
    namespace Global{ int value = 100; }
    
    //OnInitDialog:
    CString str;
    str.Format("%i", Global::value);
    MessageBox(str); //Ausgabe: 100
    
    Global::value = 200;
    str.Format("%i", Global::value);
    MessageBox(str); //Ausgabe: 200
    

    error LNK2005: "int Global::value" (?value@Global@@3HA) bereits in StdAfx.obj definiert
    Debug/Test.exe : fatal error LNK1169: Ein oder mehrere mehrfach definierte Symbole gefunden
    Fehler beim Ausführen von link.exe.

    Unterdrückt man /INCREMENTAL mittels /FORCE in den Linkereinstellungen, dann erhält man folgenden Warnhinweis:

    LINK : warning LNK4075: /INCREMENTAL wird aufgrund der Angabe von /FORCE ignoriert
    TestDlg.obj : warning LNK4006: "int Global::value" (?value@Global@@3HA) bereits in StdAfx.obj definiert; zweite Definition wird ignoriert
    Debug/Test.exe : warning LNK4088: Anwendung wurde gemaess der Option /FORCE generiert; Anwendung kann vielleicht nicht ausgefuehrt werden

    Ein einfaches Musterbeispiel für LNK2005! 🙂



  • Vielleicht sollte man diesen Beitrag (evtl.noch ergänzt) in die FAQ legen.


  • Administrator

    Aber das mit dem umhüllen mit namespace dient nur der Verschönerung nicht? Man kann ja eine Globale-Variable auch einfach in der StdAfx.h deklarieren.

    // StdAfx.h
    extern int G_GlobalerInteger = 10;
    

    Grüssli



  • Weniger Verschönerung als Kapselung. In übersichtlichen Fällen kannst Du das auch so machen wie seit alten C-Zeiten, ich würde es mit namespace machen. 😉



  • Erhard Henkes schrieb:

    Vielleicht sollte man diesen Beitrag (evtl.noch ergänzt) in die FAQ legen.

    Gern. 🙂
    Ich lass ihn trotzdem erstmal in den Keller rutschen, damit alle was gesagt haben, die was sagen wollten. 😉


Anmelden zum Antworten