Muss man extern verwenden?



  • Danke, aber keine der Beiträge hilft mir leider weiter.

    junix sein Beitrag versteh ich leider nur ansatzweise, bissle verständliche Quelltextbeispiele wären da sicherlich nicht deplaziert.

    WebFritzi sein Beitrag ist für mein Problem auch nicht sinnvoll, ich arbeite ja mit den Variablen in den einzelnen Frames, verändert dort diese.

    Also bleibts wohl bei globalen Variablen mit extern. (mist alles zurückmodeln)



  • Erklär mir mal warum du deine Variablen nicht zu Membervariablen deiner Frames oder Forms machen kannst.
    Globale Variablen sollte man grundsätzlich vermeiden. Wenn ich in einen meiner Programme wirklich welche brauche, packe ich die alle zusammen in eine Klasse und mache aus der dann ein Singleton. So kann ich den Zugriff wenigstens einigermaßen kontrollieren.



  • Ich habe eine Hauptform und zusätzlich um die 30 Frames.
    Globale Variablen mit denen ich in den einzelnen Frames Arbeite sind ca 40 (nicht alle in jedem Frame, immer nur ein Teil davon) und dort verändere ich natürlich auch deren Inhalt.

    So mach ichs momentan

    TForm1 *Form1;
    
    int X = 5;
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     Caption = IntToStr(X);
    }
    //---------------------------------------------------------------------------
    
    TForm2 *Form2;
    
    extern int X;
    
    //---------------------------------------------------------------------------
    __fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
     Caption = IntToStr(X);
     X = 6; // Form1->Caption würde nun 6 nach Form1->Button1Click() zeigen
    }
    //---------------------------------------------------------------------------
    

    Ich würde nun gern auf X in TForm2 zugreifen wollen ohne dies extern erst bekannt machen zu müssen.



  • Wenn globale Variable wirklich(!) Notwendig sind, dann solltest du diese trotzdem "zentral" verwalten. Lege einfach 2 Dateien an, "globals.cpp" und "globals.h" ...
    In der globals.h musst du auch das Schlüsselwort "extern" verwenden.



  • Inwiefern ist das jetzt hilfreich? Was meinst du genau mit "zentral verwalten"?



  • Hallo

    Wie er es gesagt hat :

    Lege einfach 2 Dateien an, "globals.cpp" und "globals.h" ...
    In der globals.h musst du auch das Schlüsselwort "extern" verwenden.

    Builder-spezifisch heißt das eine neue Unit anlegen (enthält .cpp und .h) und im Header alle globalen Variablen deklarieren (mit extern) und in der cpp alle Variablen implementieren (ohne extern)

    Aber auch ich rate dir von globalen Variablen ab, Membervariablen sind sicher besser geeignet. Überdenk dein Konzept.

    bis bald
    akari



  • Dank an akari, für die Erklärung.

    Aufgrund des Beispiels (Berdi) hatte ich angenommen, dass du "hier und da" mal eine Variable für die globale Verwendung deklarierst. Man geht bei solch einem Stiel kaputt: Wurde denn eine Variable X schon in Unit xyz angelegt? Welche von beiden verwendet die Unit abc ....

    Ich setze auch auf Membervariablen (und hasse diese Bezeichnung;)), aber in der Realität und in übernommenen Projekten kommt es öfter mal vor, dass es globale Variablen gibt. Sie sind aus der Programmierung nicht wirklich wegzudenken – andere Diskussion.
    TForm1 * Form1; // == globale Variable 😉

    Wenn man also wenigstens eine eigene Unit für die globalen Variablen verwendet, sinkt die Fehleranfälligkeit erheblich.



  • Hallo

    thomas69 schrieb:

    Ich setze auch auf Membervariablen (und hasse diese Bezeichnung;)), aber in der Realität und in übernommenen Projekten kommt es öfter mal vor, dass es globale Variablen gibt. Sie sind aus der Programmierung nicht wirklich wegzudenken – andere Diskussion.

    Meistens fasse ich solche globalen Werte/Objekte aber in einem Singleton zusammen.

    TForm1 * Form1; // == globale Variable 😉

    Das ist aber grad ein schlechtes Beispiel. Ich schalte in meinen Builder-Projekten immer alle automatischen Formgenerierungen aus (ausser das Main-Form) und benutze auch diese Pointer nicht. Alle anderen Dialoge werden dynamisch angelegt.

    bis bald
    akari



  • Sind ja an die 40 globale Variablen, der Weg über die seperate Unit macht sich gut. Danke!

    Mit Membervariablen meinst Klassenvariablen?



  • Hallo

    Berdi schrieb:

    Mit Membervariablen meinst Klassenvariablen?

    Genau

    bis bald
    akari



  • Ja schon verständlich, da man dann auf die Variable der Klasse zugreift und Überschneidungen nicht passieren können. Allerdings müsste man dann jetzt mehrere tausend mal "glo." (glo = class) davorschreiben. 😮 🤡


Anmelden zum Antworten