Globale Variable und Vektor löschen



  • Hiho

    ich versuche derzeit mich bisschen näher mit c++ zu beschäftigen außerhalb und bin nun auf 2 Probleme gestoßen.

    Mein erstes Problem ist, dass ich eine Variable habe, die ich aus einer Textdatei auslesen möchte (kein Problem) und global verwenden möchte. Da ich aber alles auf mehrere Header-Dateien + cpp-Dateien aufgeteilt habe, weiß ich leider nicht so ganz wie ich das ganze bewerkstelligen soll.
    Zunächst dachte ich mir, eine weitere Header-Datei zu erstellen, die ich überall einbinde. Sobald ich nun aber in dieser Header-Datei zum Beispiel

    int hoehe;
    

    schreibe, bringt er mir die Fehlermeldung, dass diese Variable mehrmals definiert wurde. Was also tun, dass ich diese Variable in jeder meiner Dateien verwenden kann?

    Meine 2. Frage bezieht sich auf das löschen von Vektoren in Funktionen.
    Zunächst: Ist es überhaupt möglich einen Vektor wieder zu löschen (wie bei Klassen mit new und delete)? Sofern nein, stellt sich die Frage wohl nicht und ich muss anders an das Problem rangehen.
    Ich habe in meiner Main-Datei einen 2-Dimensionalen Vektor initiert mit

    vector<vector<int> > spielfeld;
    

    Da ich diesen Vektor von 2 variablen abhängig machen möchte (also beliebig vergrößern via Eingabe) habe ich mir eine weitere Funktion geschrieben um den Vektor zu vergrößern. (weite und hoehe sollen globale Variablen sein)

    vector<vector<int> > erstelleSpielfeld()
    {
        vector<vector<int> > vektor;
        vektor.resize(weite);
        for (int i = 0; i < weite; ++i)
            vektor[i].resize(hoehe);
        return(vektor);
    }
    

    Nun kann ich meinen Vektor spielfeld in der Main-Datei die richtige Größe via Funktion zuweisen. Nur wie genau lösche ich in der Funktion den Vektor "vektor" wieder? Ich kann ihn ja schlecht löschen, bevor ich ihn per return wiedergegeben habe. Soviel ich weiß, sollte man ihn ja wieder löschen, da ich sonst 2 Vektoren habe, welche den Speicher belegen, statt nur einen.

    mfg Sinsei


  • Mod

    Antworten:

    1. extern int sowieso; im Header, int sowieso; in einer der Codedateien.
      2. Variablen zerstören sich selbstständig, wenn sie ihren Scope verlassen. Hier wird das Original der Kopie nach Ende der Funktion automatisch zerstört. (Genau genommen, wird es gar kein Original geben und es wird gleich der vector in der main verändert werden, das nennt man return value optimization)

    Ratschläge:
    1. Globale Variablen sind hochgradig gefährlich. Besonders wenn man unerfahren ist und nicht einmal extern kennt. Lass das sein!
    2. Du willst keinen vector<vector>. So wie du ihn benutzt möchtest du eine 2D-Arrayklasse, die intern einen 1D-Vector hat und die Zugriffe auf Element (x,y) automatisch auf das interne Element (x*breite + y) umrechnet.

    Allgemein: Überhaupt solltest du dein Design sauberer objektorientiert machen. Dann brauchst du weder so komplizierte Datentypen direkt anzufassen, noch globale Variablen.



  • Danke dir SeppJ. Da du meintest, dass das mit den Globalen Variablen gefährlich sei, habe ich mal anders an das Ganze rangewagt.
    Und dabei kam ein neues Problem auf:

    Via Funktion möchte ich in eine Textdatei meine Variablen Höhe und Weite schreiben. Da ich die beiden Variablen einzeln reinschreiben möchte, habe ich 2 solcher Funktionen. Dabei rufe ich dann jeweils aus der Textdatei bereits die Variable auf, die ich nicht verändern möchte und schreibe sie direkt wieder rein (sonst würde ich die Variable überschreiben und somit nur noch 1 Variable drin stehen haben). Meine Funktion sieht so aus:

    void optionHoehe()
    {
        int hoehe;
    
        while(hoehe > 24)
        {
            cout << "Welchen Wert soll Hoehe erhalten (Maximum = 24)" << endl;
            cin >> hoehe;
            if(hoehe > 24)
            {
    
                cout << "Ihr Wert ist zu groß!" << endl;
            }
        }
    
        ifstream file("optionen.txt");
        string weite;
    
        getline(file, weite);
    
        file.close();
    
        ofstream schreiben;
        schreiben.open("optionen.txt");
    
        schreiben << weite << "\n" << hoehe;
    
        schreiben.close();
    
    }
    

    Mein Problem nun ist, dass wenn ich diese Funktion aufrufe, mein nächstes getline, das aufgerufen wird, (wo auch immer es ist im Programm) ignoriert wird. Sollte ich also in der obrigen Funktion am Ende noch

    string name;
        getline(cin, name);
        cout << endl << name;
    

    hinzufügen, so kann ich bei diesem getline nichts selber schreiben und es steht in der Ausgabe von cout nichts drin.

    Wo liegt mein Fehler? Muss hier wie bei getchar() noch irgendein Dummy rein?

    mfg Sinsei


Anmelden zum Antworten