tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
3
ZUGRIFFE
342
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    Apr 2002
    Ort
    Giessen (Hessen)
    Beiträge
    547
    hi Leute,
    Ich habe bei meinem Prog einen sehr komischen Fehler entdeckt.
    Hier mal eine schematische Ausführung, da ihr sicher keinen Bock auf den ganzen Code habt

    class a
    {
    int wert;
    void aendere_wert(int neuerwert);
    b]void[/b] aendere_wert2(int neuerwert2, a Ziel);

    void a()
    {
    wert = 5;
    }
    };

    void a::aendere_wert(int neuerwert)
    {
    a = neuerwert;
    }
    void a::aendere_wert2(int neuerwert2, a Ziel)
    {
    Ziel.aendere_wert(neuerwert2)
    }



    Das ist die Klassendeklaration. Soweit Alles schön und gut aber jetzt:



    void main()
    {
    a test;
    a test2;

    test.aenderewert(10);
    das geht problemlos (steht nur der vollsändigkeit habler hier)
    test2.aenderewert2(20, test); [/i]<-- PROBLEM! Der Code wird ausgeführt aber nachdem die Funktion ausgeführt wurde wird der wert wieder auf den Ursprungswert gesetzt!

    }
    [/I]

    So zur Erläuterung:
    Es wird eine Klasse mit zwei funktionen definiert:
    Eine, die den "wert" ändert und eine, die selbige aufruft.
    Problem:
    Wenn die die funktion aenderewert durch test aufrufe geht alles.
    Wenn ich jedoch die Funktion aenderewert2
    (deren aufgabe es ist bei test (nicht test2)! die funktion aenderewert aufzurufe geht es nicht. die Funktion wird zwar ausgeführt aber danach wir die variable test.wert wieder auf den Ursprungswert gesetzt.
    Quasi als würde der Konstruktor nochmal ausgeführt.

    Ich hoffe ihr versteht, was ich meine
    Bin für jede Hilfe dankbar.
     
    'Ich wäre gerne intelligent. Das würde bestimmt vieles einfacher machen.[...]'
    Hap Thompson, R.E.M

  2. #2
    Thomas Kuse Thomas Kuse ist offline Mitglied Rubin
    Registriert seit
    Aug 2001
    Beiträge
    1.411
    PHP-Code:
    void aendere_wert2(int neuerwert2aZiel);

    void a::aendere_wert2(int neuerwert2aZiel)
    {
       
    Ziel.aendere_wert(neuerwert2)
    }
    ...
    test2.aenderewert2(20test); 
    So sollte das gehen! In jedem C++ Buch kannst Du die Geschichte über den Referenz-Operator (das Kaufmännische UND nach dem Klassennamen) nachlesen!
     

  3. #3
    Registriert seit
    Apr 2002
    Ort
    Giessen (Hessen)
    Beiträge
    547
    jo genau. Jetzt gehts. Trotzdem verstehe ich nicht, warum der Wert wieder auf den Ursprungswert zurückgesetzt wurde. Naja .
     
    'Ich wäre gerne intelligent. Das würde bestimmt vieles einfacher machen.[...]'
    Hap Thompson, R.E.M

  4. #4
    basd basd ist offline Mitglied Brokat
    Registriert seit
    Nov 2003
    Ort
    München
    Beiträge
    264
    Der Funktion wurde eine Kopie deines Objektes übergeben
    a Ziel, dieses Objekt liegt auf dem Stack (was schonmal schlecht ist), sobald du die Funktion verlässt wird dieser Teil des Stacks ungültig un dein Objekt gelöscht
    Wenn du ein guten Debugger hast, beobachte mal die Innerein von test du wirst sehen, dass sich diese nie ändern (zum Beispiel kannst du das machen, indem du dir die Adresse der Membervariable merkst un den Inhalt beobachtest)
     

Ähnliche Themen

  1. Buchstaben durch andere ersetzen
    Von PH234X im Forum .NET Windows Forms
    Antworten: 2
    Letzter Beitrag: 09.01.09, 16:43
  2. Null-Referenz-Fehler bei Funktionsaufruf
    Von TommesDee im Forum Flash Plattform
    Antworten: 3
    Letzter Beitrag: 13.03.08, 12:39
  3. Antworten: 2
    Letzter Beitrag: 15.06.07, 14:10
  4. Antworten: 12
    Letzter Beitrag: 04.11.05, 11:00
  5. Antworten: 8
    Letzter Beitrag: 13.04.04, 19:50