Wie lösche ich eine Klasse?



  • Hallo jungs und mädels.

    Ich habe ein basisprogramm für den Umgang mit Klassen erstellt.

    Nun scheitert es beim löschen eines Datensatzes. Vielleicht wisst ihr ja mehr.

    Hier ein Bild vorab:
    http://www.info-elite.de/crime/form.jpg

    Nun zum Programm.

    Hier mal mein Zeigen Button

    kettenglied *letzter;
    
         MemoAusgabe->Lines->Clear();
    
         letzter = erster;
    
    while (letzter->hole_next() != NULL)
    
          {
    
          letzter = letzter->hole_next();
    
          MemoAusgabe->Lines->Add(letzter->hole_vorname());
          MemoAusgabe->Lines->Add(letzter->hole_name());
          }
    
          return;
    
          }
    

    Kann ich diesen nicht zu einem Löschen Button umformen?
    Ich weiß auch das man mit delete arbeiten muss, aber nicht wie man es genau einbindet.
    Ich möchte immer jeweils das "AKTUELLE" Kettenglied, sagen wir den Aktuellen Datensatz löschen.
    Wenn ich Vorname Nachname, Vorname1 Nachname1 habe und mit den Pfeilen vor oder zurück
    gehe möchte ich jenachdem auf welchen Datensatz ich gerade zeige diesen löschen.

    delete (letzter);
    

    klappt zum beispiel nicht und und und.

    Hoffe ihr könnt mir helfen.

    Gruß
    David



  • Verstehe ich das jetzt richig, dass letzter ein Zeiger ist und du mit

    letzter = new blabla;

    irgendwo im Programm Speicher reservierst? (Oder zumindest do Speicher auf dem Heap reservierst und dann letzter auf das zu löschende Element zeigen lässt?)

    Wenn dem nämlich so ist, müsstest du das auch mit

    delete letzer;

    freigeben können oder stehe ich jetzt auf dem Schlauch?

    Edit: Also das Opfer von delete muss natürlich auf dem Heap liegen (new) und nicht auf dem Stack (wenn ich mich nicht völlig irre).



  • ich habe es jetzt so gelöst:

    public:
    int del();
    

    Methode

    int kettenglied::del(){  
    kettenglied * temp = this->next;  
    
    kettenglied * temp2 = this->back;
    
    if (this->next == NULL){  
            temp2->next = NULL;  
            return 0;  
    }  
    
    if (this->back == NULL){  
            temp->back = NULL;
            return 0 ;
    }
    delete this;
    temp->back = temp2;
    temp2->next = temp;  
    
    return 0;  
    
    }
    

    Löschen Button

    aktuell->del();
    return;
    


  • Hmm, das sieht aber verdammt nach std::list aus. Hat das einen Grund, dass du die nicht nutzt?



  • David_ schrieb:

    int kettenglied::del(){  
    ...
    delete this;
    ...
    

    Also DAS sollte doch wohl immer schieflaufen, oder ?
    IIRC kann ein Objekt keinen "Selbstmord begehen"....

    Gruß,

    Simon2.



  • Das geht schon. Man darf nur nach dem delete nicht mehr auf irgendwelche Member der Klasse zugreifen. Ich finde das nur irgendwie unschön. 🙂



  • @David: Hast du schonmal etwas von "Destruktoren" gehört?



  • Braunstein schrieb:

    ...Ich finde das nur irgendwie unschön. 🙂

    Seeeeehr diplomatisch ausgedrückt. 😉

    Gruß,

    Simon2.



  • David_ schrieb:

    ...

    Mir scheint, Du hast da noch einen Denk-/Designfehler drin: Du hast zwei eigene "Einheiten": Die "Kettenglieder" und die "Kette als Ganzes".
    Es ist nicht die Aufgabe eines Kettengliedes, sich zu löschen oder zu erzeugen, sondern einfach nur "da zu sein". Die "Kette als Ganzes" ist für die Verwaltung der einzelnen Glieder zuständig ... sie erzeugt, löscht, hängt um, gibt aus, .... .
    Zumindestens würde ich das so implementieren (also 2 Klassen).
    Noch eher: Ich würde mit eine std::list<FachDaten> hernehmen, die das alles für mich macht (inkl. der previous-/next-Verbindungen).

    Gruß,

    Simon2.

    P.S.: Du solltest Deinen Threadtitel mal ändern, denn "Klassen löschen" macht man mit der IDE auf der Festplatte.... und das ist wohl nicht das, was Du willst. Du möchtest "Objekte aus einer Liste entfernen". 😉



  • Also soweit ich weiss, muss man nicht zwingend eine Methode zum loeschen einer Klasse spendieren. Man kann auch einfach die Klasse allokieren:

    Class *Object = new Class;
    

    und spaeter, wenn sie nicht mehr gebraucht wird mit:

    delete Object;
    

    wieder loeschen.

    Der Zugriff erfolgt dann ueber:

    Object->Method();
    


  • LMwoot schrieb:

    Also soweit ich weiss, muss man nicht zwingend eine Methode zum loeschen einer Klasse spendieren. ...

    Ich würde sogar sagen: Eine solche Funktion bringt mehr Probleme als Vorteile (gaaanz spezielle Designpatterns mal ausgenommen).

    Was Du beschreibst, ist richtig ... und zeigt mE auch den richtigen Weg: Von Außen wird das Objekt erzeugt (mit new), genutzt und gelöscht (delete)...

    Gruß,

    Simon2.



  • Ihr mögt alle recht haben 🙂

    Nur meine version funktioniert einwandfrei *duck*

    Für eure genannten beispiele bin ich wohl noch nicht weit genug in der materie der Sprache c++ 😉

    Gruß
    David



  • Die funktioniert genau solange einwandfrei, bis der erste Fehler kommt 😛



  • David_ schrieb:

    Ihr mögt alle recht haben 🙂

    Nur meine version funktioniert einwandfrei *duck*...

    Was war denn dann Deine Frage ? 😉

    Gruß,

    Simon2.



  • David_ schrieb:

    Ihr mögt alle recht haben 🙂

    Nur meine version funktioniert einwandfrei *duck*

    Für eure genannten beispiele bin ich wohl noch nicht weit genug in der materie der Sprache c++ 😉

    Gruß
    David

    Wenn Du es nicht schaffst diese Einstellung zu überwinden wirst Du imemr nur ein mittelmässiger Programmierer bleiben.

    Du hast (richtig) erkannt das Du etwas nicht begriffen hast (delete sache). Die Leute hier haben Dir einige gute Denkansätze gegeben. Der richtige Weg wäre es jetzt sich hinzusetzen und diese Denkansätze solange zu bearbeiten bis Du begreifst was damit gemeint ist. der absolut falsche Weg ist es mit solche Argumenten andere ideen zu blocken und mit der eigenen (schlechten) weiterzumachen, nur "weil sie doch funktioniert". dabei behaupte ich jetzt mal ganz frech das Dir einfach das tiefergehende Verständnis fehlt um tatsächlich beurteilen zu können ob Deine variante tatsächliche "einwandtfrei funktioniert" oder nicht in Wirklichkeit einfach nur "zufällig funktioniert".

    Allzu viele Programmierer geben sich leider mit letzterem Zufrieden...


Anmelden zum Antworten