Globale Variablen umgehen
-
Hallo,
ich habe eine Klasse z.B. CTestClass in der ich mehrere Variablen benutze. Jetzt habe ich über einen Menupunkt aufrufbar eine Eingabemaske, wo der Benutzer viele Variablen mit seinen Werten initialisieren bzw. vorbesetzen kann. Um an den globalen Variablen vorbei zu kommen (sie werden in mehreren Funktionen und Methoden benutzt) habe ich das wie folgt gemacht:
TestClass.h
//--------------------------------------------------------------------------- #ifndef TestClassH #define TestClassH //--------------------------------------------------------------------------- struct SetupParameters { int Var1; int Var2; int Var3; int Var4; int Var5; }; class CTestClass { private: // Eigenschaften int m_Var1; int m_Var2; int m_Var3; int m_Var4; int m_Var5; public: // Methoden CTestClass(); struct SetupParameters getVars(); void setVars( struct SetupParameters ); }; //--------------------------------------------------------------------------- #endifTestClass.cpp
//--------------------------------------------------------------------------- #include <vcl.h> #include <iostream> #pragma hdrstop #include "TestClass.h" //--------------------------------------------------------------------------- #pragma package(smart_init) using namespace std; CTestClass::CTestClass() { // Initializierung der Variablen mit 0 m_Var1 = 0; m_Var2 = 0; m_Var3 = 0; m_Var4 = 0; m_Var5 = 0; } //--------------------------------------------------------------------------- struct SetupParameters CTestClass::getVars() { SetupParameters PSetup; PSetup.Var1 = m_Var1; PSetup.Var2 = m_Var2; PSetup.Var3 = m_Var3; PSetup.Var4 = m_Var4; PSetup.Var5 = m_Var5; return PSetup; } //--------------------------------------------------------------------------- void CTestClass::setVars( struct SetupParameters SP ) { m_Var1 = SP.Var1; m_Var2 = SP.Var2; m_Var3 = SP.Var3; m_Var4 = SP.Var4; m_Var5 = SP.Var5; } //---------------------------------------------------------------------------Unit1.cpp
//--------------------------------------------------------------------------- #include <vcl.h> #include <iostream> #pragma hdrstop #include "Unit1.h" #include "TestClass.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" using namespace std; TForm1 *Form1; // Instanziierung von TC und SP CTestClass TC; SetupParameters SP; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { SP = TC.getVars(); // Hier werden die Variablen vom Programm mit Werten vorbesetzt // z.B. SP.Var1 = 11; SP.Var2 = 22; SP.Var3 = 33; SP.Var4 = 44; SP.Var5 = 55; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { // Hier werden die Variablen über eine Benutzer-Eingabemaske angepaßt // und später gespeichert // z.B. SP.Var1 = 1; SP.Var2 = 2; SP.Var3 = 3; SP.Var4 = 4; SP.Var5 = 5; TC.setVars( SP ); } //---------------------------------------------------------------------------Nun meine Frage: Ist das aus eurer Sicht so ok bzw. kann man das so machen oder wie würdet ihr das anders machen ? In diesem Beispiel sind nur 5 Variablen, aber im eigentlichen Programm sind das 10 - 20 Variablen, deshalb habe ich ein struct genommen.
Bin sehr dankbar für ein paar Tips
WoWe
-
Hallo
mach SP besser zu einem Member des Forms, genau wie alle andern Sachen, die pro Form genau einmal vorhanden sein sollen.
bis bald
akari
-
Hallo akari,
ich weis nicht genau wie du das meinst ? Die Deklaration von "struct SetupParameters" von TestClass.h nach Unit1.h ?
-
Hallo
nein, die beiden hier
// Instanziierung von TC und SP CTestClass TC; SetupParameters SP;in den Header der Form (Form1.hpp), wo sie dann unter private stehen sollten.
bis bald
akari
-
OK, danke ! Hat funktioniert ! Und der Rest ist so auch ok, oder gibt es da noch was auszusetzen ?
-
hi,
wenn du variablen 'weniger global' machen willst, dann helfen eventuell namespaces oder 'static'...
-
Hi net,
ich will nicht weniger global als unbedingt nötig. Also, wenn das in meinem Beispiel den C++ Regeln genüge tut, ist das für mich ok.
-
WoWe schrieb:
wenn das in meinem Beispiel den C++ Regeln genüge tut, ist das für mich ok.
beim programmieren ist alles erlaubt, was dem zweck dienlich ist.