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 werdenEin einfaches Musterbeispiel für LNK2005!
-
Vielleicht sollte man diesen Beitrag (evtl.noch ergänzt) in die FAQ legen.
-
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.