Anfänger Problem mit Klasse / COUT



  • Kannst du bitte mal die Aufrufende Funktion posten, die dann zum Absturz führt? Bei den Strings habe ich zumindest nicht die sonst oft vorkommenden Fehler gefunden und würde nun erstmal an anderer Stelle genauer hinschauen wollen.

    Und btw: std::string ist dein Freund!



  • Achso, bei den Const-Accesors solltest du auch darauf achten, dass der Nutzer die Daten der Objekte nicht verändern kann, also auch const-Zeiger zurückgeben. Aber das führt hier nicht zum Absturz...



  • Also die Funktion bei der er abstürzt ist wenn ich cout << k mache..
    also liegt es wohl an meinem << operator oder.. kein plan..

    Ich finde den Fehler nicht ich hocke schon stundenlang..

    Und ja, wie gerne würde ich string hernehmen aber ich wir müssen hier als Aufgabe char arrays hernehmen.

    Danke!


  • Mod

    currency schrieb:

    Also die Funktion bei der er abstürzt ist wenn ich cout << k mache..

    Da du k als Zeiger übergibst und im Operator dereferenzierst: Mal geguckt, ob k auch einen gültigen Wert hat?



  • Stimmt..
    Bei setKunde wird nur die KNR erfolgreich gesetzt.

    {m_knr=123456789 m_nname=0x00000000 <Schlechtes Ptr> m_vname=0x00000000 <Schlechtes Ptr> }

    Dann liegts wohl an setVname und setNname... !?



  • if( m_vname != NULL )
    

    bzw.

    if( m_nname != NULL )
    

    => Es wird nicht gesetzt...

    Aber gleich wird er sich beim 2.

    cout << n << endl;
    

    auf die Nase legen 😉



  • Argz!

    if( m_vname != NULL )
        {
            delete [] m_vname;
            m_vname = new char[strlen(vname)+1];
            strcpy(m_vname, vname);
        }
    

    Nur das delete sollte innerhalb des if-Blocks sein, das hab ich total überlesen^^
    Und selbst das delete kannst du ohne if ausführen, da C++ garantiert dass ein delete nullpointer okay ist und nix macht.

    Edit: XSpille, auch diesmal bezog sich mein Posting nicht auf deines xD



  • Ja habe das geändert... aber iwie ist bei mir jetzt das Fenster unten weg wo ich beim debuggen den Wert der Variablen sehe -.-

    Programmiere mit Microsoft Visual Studio 2010 Pro.

    Wisst ihr wo das ist.. habe unter Ansicht gerade schon jegliche Fenster eingeblendet.. aber irgendwie nicht dieses Debug Fenster.

    Und klar gehört das aus dem if-Block heraus... Logikfehler.. ^^
    Danke!

    Hoffe das funktioniert jetzt



  • Da das Programm nicht abstürzt, wird der Debugger gar nicht bequemt. Nutze die Leiste links am Editor-Fenster um einen Breakpoint einzufügen (Dort hinclicken, es entsteht ein kleiner roter Kreis), ab wo auch immer du deinem Programm zuschauen möchtest - zum Beispiel neben der ersten Zeile deiner main-Funktion - und benutze dann nochmal im Menü "Debuggen starten". Dann sollte er beim Erreichen des Breakpoints in den gewohnten Debug-Modus gehen.



  • Stimmt... ok also das funktioniert jetzt

    ABER

    Jetzt gibt es das Problem, dass wenn ich unten k lösche und n ausgebe, das der selbe Fehler kommt. Habe nachgeschaut, n hat beim Char array die selben Adressen, also es wird nur eine Flache Kopie erstellt und nicht eine gewollte Tiefe Kopie mit verschiedenen Adressen.
    Aber warum?
    Ich nehme dazu meine SetterMethoden und in denen lege ich ja mit
    = new char... ein neues Objekt mit eigener Adresse an.. oder?!



  • Mir liegt da eine Frage auf der Zunge, und da ich sie hier bisher nicht gefunden hab, stell ich sie einfach mal. Was spricht gegen die Verwendung von std::string statt char* ??



  • Du redest hier von Teilen deines Quelltextes, die du uns vorenthältst.
    Ich vermute mal, du hast 2 Zeiger und benutzt dann direkt auf diese den =-Operator. Damit kopierst du die Zeiger, nicht die Objekte. Also *k = *n müsste es lauten, falls k und n Zeiger auf Kunden-Objekte sind.



  • Die Aufgabenstellung spricht dagegen ^^
    Leider !! 😉



  • Siehe meinen Edit.



  • Welche Teile ?

    Also meine Setter, damit mein ich das setNname, setVname usw.
    und der Operator= wird ja auch überladen.

    Meine main ist auch onch die selbe.

    Ich erstelle k und weise Werte zu.
    Dann erstelle ich n und weise k zu.
    Dann lösche ich k "delete k" und gebe n nochmal aus.

    Oder was meinst du mit Codeteile verschweigen?!



  • Ahh, entschuldige, ich bin etwas verwirrt, hatte den ersten Quelltextschnipsel überlesen.

    Kunde *n = new Kunde();
        //n = k; // Kopiert nur die Addresse
        *n = *k; // Kopiert das Objekt.
        cout << n << endl;
    
        cout << "K wird geloescht - n ausgegeben" << endl;
        //delete k;
        cout << n << endl;
    
        cin.get();
    


  • aaaaaaaaaaaaaaaaach man.. wahnsinn... das war es echt ...

    Bin jetzt daran Stunden gehockt...

    Man oh man ^^ verstehe aber iwie nicht warum das Sternchen davor sein muss.
    Das Sternchen geht ja wie ich immer verstanden habe genau zum Wert. Und so nimmt er den Zeiger also einfach nur die Adresse sozusagen... oder?!

    Danke !!! 🙂 🙂



  • Ja, so ein Zeiger ist ja intern nur eine Zahl die den Speicherplatz im "RAM" angibt. Diese Zahl kann man natürlich auch kopieren, aber du willst ja kopieren, was sich an dem Ort befindet, auf den der Zeiger zeigt.



  • Ok... Danke Decimad !!

    Funktioniert jetzt perfekt :xmas1:



  • Freut mich, fröhliche Weihnachten wünsche ich^^ :xmas2:


Anmelden zum Antworten