titel



  • nachrichtentext



    1. Das Erstellen einer leeren Liste sollte man wohl als Konstruktor machen

    2. Deine Liste ist eine "intrusive list" - das deckt sich IMO nicht mit der Aufgabenstellung

    3. Du verwendest oft Referenzen, wo keine nötig sind (und auch keinen Sinn machen)

    4. Exceptions sollten von std::exception abgeleitet werden. Die Aufgabenstellung ist da aber etwas ungenau ("die als Text geworfen wird" - WTF?)

    5. Du übergibst an alle Funktionen den "Anker" - was soll das? Der "Anker" ist denke ich der Kopf der Liste, der sollte IMO einfach ein Member der Listenklasse sein.

    6. Wenn man die Aufgabe wörtlich nimmt, solltest du nichts inline implementieren

    7. die "push-back Methode" würde ich "push_back" nennen

    8. die "erase Methode" würde ich "erase" nennen

    9. Deine Methode "ausgabe" ist falsch, die gibt einfach N-mal das erste Element aus. Und nirgends steht etwas davon, dass die Methode einen "anzahl" Parameter nehmen sollte - d.h. es sollte immer die ganze Liste ausgegeben werden.

    10. In der Aufgabe steht nichts davon dass die "push-front Methode" irgendwelche Daten abfragen sollte -- die "push-front Methode" sollte ein Element ("struct person") als Parameter nehmen, und dieses vorne an die Liste dranhängen

    11. "Hans" ist kein guter Name für eine Liste von Personendaten - "personendaten" wäre ein besserer Name, findest du nicht?

    12. Die "whatfkt" heisst normalerweise einfach "what"

    13. Entweder du implementierst einen Copy-Constructor, oder machst die Klasse nicht-kopierbar (private Copy-Constructor deklarieren)

    14. Was für den Copy-Constructor gilt, gilt auch für den Assignment-Operator

    15. Irgendwer sollte alle erzeugten Objekte ("new") wieder freigeben ("delete") - normalerweise macht man das im Destruktor

    16. Das ist alles ganz fürchterlich *g*

    Und noch ein Tip: "anker" und "anzahl" sind zwei Dinge, die in eine eigene Klasse gehören, welche es bei dir (noch) nicht gibt 😉
    (bzw. "anzahl" brauchst du eigentlich nicht)



  • Hi,

    Torboe schrieb:

    ......
    //anlegen einer leeren liste
    
    void personen::leere_liste()
    {
    	personen* anker=NULL;
    	
    }
    

    was soll das werden!? Du legts hier eine lokale Variable an und weisst ihr NULL zu! Diese wird aber gleich wieder zerstört.

    Evtl sollteste dich auch nochmal mit Klassen beschäftigen. Was die für nen Zweck haben usw.

    Und ich muss mich dem Punkt 16 von "hustbaer" anschließen (den anderen natürlich auch ;)), aber dem ganz besonders.

    Gruß Pingu



  • nachrichtentext





  • nachrichtentext



  • Torboe schrieb:

    hmmmm also meine liste ist intrusiv, weil sie eine vorhandene datenstruktur (struct person) benutzt. aber ich wüsste nicht wie ich das sonst machen sollte... ?!

    sie soll ihre eigene datenstruktor (struct knoten) bebnutzen. mit folgendem trick lassen sich dann doch personen verwalten:

    struct knoten
    {
       person daten;
       knoten* next;
    };
    


  • nachrichtentext



  • Torboe schrieb:

    jetzt bin ich etwas verwirrt. und wo soll ich dann die methoden und eigenschaften unterbringen??

    Nun Du brauchst am Ende drei Klassen:
    1.) person - schon vorhanden
    2.) knoten - Ein Element einer Liste; das Element hält ein person-Objekt und einen Pointer zum Verlinken der einzelnen Elemente
    3.) Personenliste - eine Klasse, bei der ein Objekt alle Elemente (Knoten) einer Liste von Personen enthält.

    Versetze Dich einfach in die Lage des Anwenders Deines Codes:

    // - Anlegen einer leeren Liste
        Personenliste personen;  // das Objekt 'personen' ist noch leer, hat ja keiner was reingetan
    
        // - Push-Front-Methode, die ein neues Person-Element (Parameter) am Anfang der Liste einfügt
        person hans, berta, steffi;
        // ...
        personen.push_front( hans );
        personen.push_front( berta );
        personen.push_front( steffi );
    
        // - Erase Methode, die ein bestimmtes Element (Nummer des Elements in der Liste ist Parameter) aus der Liste entfernt. 
        personen.erase( 1 ); // löscht das zweite Element in der Liste (index=0 ist das erste); hier die Kopie von 'berta'
    
        // - Funktion ausgabe, die den Inhalt der Liste auf dem Bildschirm ausgibt
        cout << "Alle Personen:\n" << personen << endl;
    

    D.h. fast alle zu implementierenden Methoden sind Methoden der Klasse Personenliste. Denk' dran, dass im Destruktor von Personenliste allokierter Speicher auch wieder freigegeben werden muss.

    Gruß
    Werner



  • nachrichtentext



  • Torboe schrieb:

    ok. hier mal ein beispiel. nur um einen neuen satz hinzuzufügen.

    struc person{
    string name;
    int alter;
    };
    

    hier wäre ein Konstruktor wünschenswert, dem man gleich einen Namen und das Alter übergeben kann.

    Torboe schrieb:

    class pliste{
    private knoten* anker;
    
    public: 
    (...)
    person(char*, double);
    void einfuegen_vorne(char* double),
    

    was soll die Methode 'person' hier machen?

    Torboe schrieb:

    person hans;
        // ...
        personen.einfuegen_vorne( hans );
    

    jetzt erstelle ich ein objekt vom typ person und rufe die personen.push_front methode mit diesem objekt hans auf.

    push_front wär gut - heißt bei Dir immer noch 'einfuegen_vorne' ?!

    Torboe schrieb:

    wie sieht dann die einfuegen_vorne methode aus?

    (s.u.) im Prinzip schon richtig

    Torboe schrieb:

    und initialisiert wird das objekt hans dann schon mit dem standartkonstruktor aus der klasse person oder??

    .. wenn einer existiert, so wird nur der Standardkonstruktor von string aufgerufen. Der String ist dann leer.

    Torboe schrieb:

    kann mir das bitte noch jmd sagen? ich schreibe morgen klausur 😮.

    edit:

    void pliste::einfuegen_vorne(person*& Pobjekt)
    {
    knoten* node = new knoten;
    node->daten = Pobjekt;  
    node->next = Anker; 
    Anker = node;       
    }
    

    Das person-Objekt liegt auf dem Stack - und Du solltest es hier kopieren. Denke einfach es wäre ein int. Dann steht da:

    void pliste::einfuegen_vorne( const person& Pobjekt)
    {
    knoten* node = new knoten;
    node->daten = Pobjekt;  
    node->next = Anker; 
    Anker = node;       
    }
    

    Übergabe von nicht trivialen Objekten erfolgt i.A. per const Referenz (lesender Zugriff).

    Torboe schrieb:

    👍 oder 👎 ??? 😃

    na ja - da ist noch Verbesserungspotenzial.
    Gruß
    Werner



  • Torboe schrieb:

    ich schreibe morgen klausur 😮.

    Dann schau Dir vielleicht noch den Wikipedia-Artikel über Listen und diese Einführung an; Achtung die Code-Beispiele sind C, wenn Du C++ lernst, so sind die nicht vorbildlich. In C++ gibt es Konstruktoren ..

    Gruß
    Werner



  • nachrichtentext


Anmelden zum Antworten