Globale Variable in C++



  • Hallo,

    ich habe ein C++-Programm geschrieben, indem ich eine globale Variable vom Typ einer selbstgeschriebenen Klasse anlege.

    #include <iostream>
    ...
    
    static List liste;
    static int zaehler;
    
    push(a){
    
    //Weitere Anweisungen
    //Datum a wird verarbeitet, Ergebnis in b.
    
    liste.neu(zaehler, b);
    
    zaehler+=1;
    }
    
    int main (){
    
    ...
    push(a);
    
    return 0;
    }
    

    Der Grund, weswegen ich die Variable global angelegt habe ist, dass ich der in der Klasse List enthaltenen Liste alle an die Funktion push() übergebenen und verarbeiteten Daten speichern möchte. Damit die Variable nur im Hauptprogramm ersichtlich, habe ich zusätzlich das Schlüsselwort static verwendet.

    Meine Frage ist nun, wie ich diesen Sachverhalt ohne dem Einsatz einer globalen Variable lösen kann? Mit einer Singleton-Klasse?



  • Ein Singleton ist letzten Endes auch nur eine globale Variable. Damit wird dein (vermutlich) schlechtes Design nicht besser.



  • MelanieNew schrieb:

    Der Grund, weswegen ich die Variable global angelegt habe ist, dass ich der in der Klasse List enthaltenen Liste alle an die Funktion push() übergebenen und verarbeiteten Daten speichern möchte.

    ...

    Meine Frage ist nun, wie ich diesen Sachverhalt ohne dem Einsatz einer globalen Variable lösen kann?

    Du kannst die Viariablen static innerhalb der Funktion push anlegen. Aber was du hier beschreibst ist ja eher nicht die wahre Anforderung ...



  • Vermutlich ist das sinnvollste, die Funktion push so aufzuziehen:

    void push(Liste &ls, weitere parameter hier) {
      //Weitere Anweisungen
      //Datum a wird verarbeitet, Ergebnis in b.
    
      ls.neu(zaehler, b);
    
      zaehler+=1;
    }
    

    ...und dann ein normales, funktionslokales Listenobjekt in der main zu haben, das du der Funktion übergibst.



  • Hallo Seldon, Hallo Mannie,

    danke euch. Das wäre dann sauberer als mit einer globalen Variablen? Ich weiß, dass man globale Variablen, obwohl möglich, nicht nutzen sollte. Die Fehleranfälligkeit wird wohl zu groß. Wenn ich die Liste dann immer an die Funktion übergebe, leidet dann die Ausführung des Programmes nicht? Die wird schließlich mit jedem Zutun größer. Am Ende umfasst diese Tausende Einträge.



  • Die Variable zaehler müsste ich als globale Variable belassen, oder? Die Liste mit den Ergebnissen soll nämlich wie folgt aussehen:

    1. 34
    2. 56
    ...

    1056. 67

    Die Variable zaehler gibt somit an, um das wievielte Ergebnis es sich handelt.



  • Es ist nicht zu erwarten, dass die Ausführungsgeschwindigkeit des Programms leidet, da die Liste als Referenz in die Funktion übergeben wird und nicht jedes mal kopiert werden muss (dafür das & im Parameter). Sonst wäre die Veränderung der Liste in der Funktion außerhalb auch gar nicht sichtbar.

    Was den Zähler angeht: zaehler wäre doch sowieso immer die Anzahl der Elemente, die bereits in der Liste sind, sehe ich das richtig? Dann brauchst du gar keinen externen Zähler, sondern nimmst einfach die Listengröße (die sich die Liste vmtl. eh merkt/en sollte).

    Falls wirklich sinnvoll, kannst du den Zaehler natürlich ebenfalls per Referenz in die Funktion reichen:

    void push(Liste &ls, int &zaehler, weitere parameter) {
      ...
    
      ls.neu(zaehler, b);
      ++zaehler;
    }
    

    ...aber ohne weitere Informationen und besondere Rechtfertigung kommt mir ein solches Vorgehen komisch vor. Nicht ganz so komisch, wie den Zaehler in einer globalen Variable zu halten, aber komisch. Kannst du vielleicht etwas eingehender beschreiben, was du da eigentlich machst?



  • Hallo Seldon,

    im Hauptprogramm parse ich eine XML-Datei. Die Informationen aus der XML-Datei reiche ich an die Handlerfunktion. Diese möchte ich dann in meiner Liste speichern. Nach Beendigung möchte ich die Daten in der Liste verarbeiten. Der Parser reicht, wenn er ein Element gefunden hat, dieses an die Handler-Funktion push. Die dort überreichten Werte sollen dann alle nacheinander in die Liste aufgenommen werden. Deswegen habe ich die Liste als globale Variable definiert.



  • Das klingt für mich sehr danach, als könntest du einfach die Listenlänge benutzen. Einen Grund dafür, globale Variablen zu benutzen, sehe ich da jedenfalls nicht, ganz im Gegenteil. Irgendwann willst du mal zwei Dateien parsen, und dann stehst du mit globalen Variablen dumm da.

    Gibt es eigentlich einen Grund, dass du eine eigene Listenklasse zusammenschusterst, statt std::vector oder std::deque zu nehmen?



  • Wie wärs, wenn du die Variable lokal deklarierst und das static davor setzt? Dann verhält sie sich auch wie eine globale. Außer dass sie nicht mehr global erreichbar ist.

    mfg



  • Das macht die Sache nicht wirklich besser.


Anmelden zum Antworten