Klasse und lokale variablen



  • moin community,

    wollt's eigentlich nur ganz schnell machen, weil ich gerade zu einer Besprechung gehe:

    Auf dem Feld tut sich nichts(also in dem Fall in "Ger"), obwohl ich in eingabe eingegeben habe, dass der User zwei Zahlen eingibt und dann wird eine Zahl eine andere usw.. In ausgabe(std::vector<int> Ger) hab ich alle sachen ausgeben wollen aber es scheint nicht zu klappen 😞
    Meine nur damit,dass das gleiche Feld wie vorher kommt mit den Zahlen ...

    class Test
    {
    public:
    void output_int(std::vector<int> Ger);
    void eingabe(std::vector<int> Ger);
    void ausgabe(std::vector<int> Ger);
    
    private:
    int e1, e2;
    std::vector<int> Ger;
    };
    
    void Test::output_int(std::vector<int> Ger)
    {
    for(int etwas = 0; etwas != Ger.size(); ++etwas)
    {
    std::cout << Ger[etwas] << std::endl;
    }
    }
    
    void Test::eingabe(std::vector<int> Ger)
    {
    std::cin >> e1 >> e2;
    Ger[e1] = Ger[e2];
    }
    
    void Test::ausgabe(std::vector<int> Ger)
    {
    output(Ger);
    eingabe(Ger);
    output(Ger);
    }
    

    Nur die Klasse ist ein wenig komisch, ansonsten hab ich in der MainCPP alles inkludiert und alles andere auch noch gemacht 😉

    Liebe Grüße
    Thomas Warhagen



  • hi nochmal

    kann mir bitte jemand eine antwort zu meiner Klasse "Test" geben?

    Liebe Grüße
    Thomas Warhagen



  • Hallo

    So wie es in deinem Quellcodeausschnitt aussieht wird dein vector nirgends mit Elementen gefüllt. Mit dem [] aber greifst du dann auf ungültigen Speicher zu. Da kannst du froh sein das es nur eine leere Ausgabe anzeigt und nicht gleich abstürzt.

    bis bald
    akari



  • du hast ein scoping-problem: wenn du eine member-funktion hast, die einem paramter hat, der namesgleich mit einer member-variable ist, so wird in der funktion der parameter und _nicht_ die member-variable verwendet, wenn du den namen nutzt.
    wenn du auf die member-variable zugreifen will, geht das so:
    Klasse::variable

    will heißen:

    void Test::eingabe(std::vector<int> Ger)
    {
       std::cin >> e1 >> e2;
       Ger[e1] = Ger[e2];
    }
    

    das Ger in der letzten zeile ist dein übergebener parameter und nicht deine member-variable. da du es als call-by-value übergeben hast, wurde beim aufruf eine kopie der übergeben variable erzeugt, die am ende wieder vernichtet wird.

    du hast jetzt zwei dinge zur auswahl: entweder du machst das ganze per reference oder lässt die parameter deiner funktionen weg und setzt bei ausgabe einmal deine member-variable richtig.



  • ghorst schrieb:

    ..oder lässt die parameter deiner funktionen weg und setzt bei ausgabe einmal deine member-variable richtig.

    joa aber wie?
    kannst du mir ein beispiel zeigen bitte?
    ich verstehe das mit

    setzt bei ausgabe einmal deine member-variable richtig.

    nicht 😞

    mfg



  • entweder mittels referenz so:

    class Test
    {
    public:
    void output_int(const std::vector<int>& Ger);
    void eingabe(std::vector<int>& Ger);
    void ausgabe(std::vector<int> Ger);
    
    private:
    int e1, e2;
    };
    
    void Test::output_int(const std::vector<int>& Ger)
    {
    for(int etwas = 0; etwas != Ger.size(); ++etwas)
    {
    std::cout << Ger[etwas] << std::endl;
    }
    }
    
    void Test::eingabe(std::vector<int>& Ger)
    {
    std::cin >> e1 >> e2;
    Ger[e1] = Ger[e2];
    }
    
    void Test::ausgabe(std::vector<int> Ger)
    {
    output(Ger);
    eingabe(Ger);
    output(Ger);
    }
    

    oder per richtiger nutzung der member-variable so:

    class Test
    {
    public:
    void output_int();
    void eingabe();
    void ausgabe(const std::vector<int>& Ger);
    
    private:
    int e1, e2;
    std::vector<int> Ger;
    };
    
    void Test::output_int()
    {
    for(int etwas = 0; etwas != Ger.size(); ++etwas)
    {
    std::cout << Ger[etwas] << std::endl;
    }
    }
    
    void Test::eingabe()
    {
    std::cin >> e1 >> e2;
    Ger[e1] = Ger[e2];
    }
    
    void Test::ausgabe(const std::vector<int>& Ger)
    {
    this->Ger = Ger;
    output();
    eingabe();
    output();
    }
    

    ich halte ehrlich gesagt die erste variante für eleganter.

    ich habe dir in ersten fall noch ein const & in die output-funktion gesetzt, damit das array nicht kopiert weden muss. bei zweiten das gleiche für die ausgabe, da wir darin das array eh einmal kopieren.



  • hi

    danke 😉

    aber das zweite scheint nicht zu klappen 😞
    das erste funktioniert, doch ich verstehe den Sinn der Referenzen in deinem Code nicht 😞



  • Thomas W. schrieb:

    aber das zweite scheint nicht zu klappen 😞

    joar, mir fällt auch gerade auf, warum. 😉 ich rufe die funktion output und nicht output_int auf. ansonsten sollte das so funktionieren oder besser: mir fällt nichts auf, was daran nicht funktionieren sollte.

    Thomas W. schrieb:

    das erste funktioniert, doch ich verstehe den Sinn der Referenzen in deinem Code nicht 😞

    naja. mit den referenzen übergibst du parameter so, das sie von der funktion verändert werden können, was du in eingabe() ja machen willst.

    die konstante referenz ist nur ein trick, um das erzeugen einer unnötigen kopie zu verhindern, was gerade bei vector<> ein recht aufwendiger vorgang sein kann. das geht aber nur, wenn man die daten intern nicht ändern will (was im ersten fall bei output_int gegeben ist) bzw. sie eh irgendwo hinkopieren will (was bei ausgabe im zweiten fall so ist.)



  • heisst das mit den referenzen also,dass wenn zbsp. "Ger" (membervariable) ein vector ist und ich in einer Funktion Ger als Referenz(vector<..> &Ger) übergebe,dass immer nur "Ger" geändert wird und kein neuer Vector erstellt wird?
    kannst du mir ein bisschen mehr zum Thema referenzen bitte erklären? die tutorials, was ich mir angeschaut hab, machen nur solche beispiele wie zbsp.:

    int haha = 55;
    int &eh = haha; // eh = haha = 55 ^^
    haha = 77; // beide 77 ..
    

    das hat doch überhaupt nichts mit meinem problem zu tun,deswegen frag ich ja^^



  • Hallo

    Thomas W. schrieb:

    heisst das mit den referenzen also,dass wenn zbsp. "Ger" (membervariable) ein vector ist und ich in einer Funktion Ger als Referenz(vector<..> &Ger) übergebe,dass immer nur "Ger" geändert wird und kein neuer Vector erstellt wird?

    Vollkommen korrekt

    kannst du mir ein bisschen mehr zum Thema referenzen bitte erklären? die tutorials, was ich mir angeschaut hab, machen nur solche beispiele wie zbsp.:

    int haha = 55;
    int &eh = haha; // eh = haha = 55 ^^
    haha = 77; // beide 77 ..
    

    das hat doch überhaupt nichts mit meinem problem zu tun,deswegen frag ich ja^^

    Doch das ist genau das gleiche wie bei deiner Funktion, nur das bei dir "eh" der Parameter der Funktion ist und du "eh" änderst um "haha" mitzuändern.

    bis bald
    akari



  • ok danke, kanns nun ein bisschen besser 😉
    danke euch beiden für den tollen support.

    Liebe Grüße,
    Thomas Warhagen


Anmelden zum Antworten