titel
-
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