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 );
    };
    //---------------------------------------------------------------------------
    #endif
    

    TestClass.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.


Anmelden zum Antworten