Verkettete Liste / Zeiger auf Objekte einer Klasse
-
Hallo,
ich hoffe ihr könnt mir helfen.
ich habe die Klasse Ort. Ein Ort wird durch seinen Namen, X und Y Koordinaten repräsentiert:
class Ort { private: string name; int x_koordinate, int y_koordinate; public: Ort(string eingabe_name, int eingabe_x = 0, int eingabe_y = 0) // Default: Nullpunkt : name(eingabe_name), x_koordinate(eingabe_x), y_koordinate(eingabe_y) { } int X() const { return x_koordinate;} int Y() const { return y_koordinate;} };
Nun habe ich eine weiter Klasse in der die verkettet Liste erstellt wird, und die Methoden dafür stehen. Bisher habe ich im Hauptmenü nur den Namen des Ortes eingegeben. Dieser wurde dann in der Liste gespeichert.
Nun soll die Klasse Ort verwendet werden.
Das heißt, in der Liste soll nun ein Zeiger auf ein Objekt der Klasse Ort gespeichert sein.Hier die Einfüge Methode der Liste aus der Klasse "liste":
class liste{ private: struct knoten { string info; struct knoten *next; }; struct knoten *pos; // Positionszeiger struct knoten *pre_pos; // Vorgänger des Positionszeigers struct knoten *anfang; // Zeiger auf den Anfang der Liste public: liste() { pos = pre_pos = anfang = NULL; // Leere Liste read_from_binary_file(); //vorhande Daten aus binäer Datei in die Liste laden. } ~liste(){ write_to_binary_file(); //vorhanden Einträge aus der Liste in Binär datei schreiben. } ........... void ins(string x, int x_ko, int y_ko) { struct knoten *p = new knoten; // erzeuge neuen knoten p->info = x; // Infowert wird x p->next = pos; // next wird initialisiert mit alten P.-Zeiger // es wird also VOR dem aktuellen Element eingefügt if (anfang == NULL) // Leere Liste anfang = p; if (pre_pos != NULL) // Positionszeiger hat einen Vorgänger pre_pos->next = p; else // neues Element steht am Anfang anfang = p; pos = p; // Positionszeiger zeigt nun auf das neue Element } ........ };
Wie erstellt ich nun in der Einfügen Methoden die Zeiger auf ein Objekt der Klasse Ort und speichere diesen in der Liste ab.
Gruß
Martin
-
Aus string info wird DeineKlasse info
-
Sorry versteh ich nicht so ganz.
Wozu brauch ich denn jetzt noch ein Klasse info?
-
Warum nicht um einen Schritt einfacher?
class ListeKnoten{ private: sting info; // ggf. mehr Dateb ListeKnoten *next, *pre_pos, // Vorgänger des Positionszeigers *anfang; // Zeiger auf den Anfang der Liste public:
-
Danke hartmut für deinen Verbesserungsvorschlag.
Werde ich einmal umsetzten, sobald das eigentliche Problem mit dem Zeiger auf die Objekte Klasse Ort gelöst ist.
DA stehe ich nach wie vor auf dem Schlauch.
-
Tobias Gerg schrieb:
Aus string info wird DeineKlasse info
Sorry versteh ich nicht so ganz.
Wozu brauch ich denn jetzt noch ein Klasse info?statt:
struct knoten { string info; struct knoten *next; };
struct knoten { Ort info; struct knoten *next; };
-
MartinO schrieb:
Danke hartmut für deinen Verbesserungsvorschlag.
Werde ich einmal umsetzten, sobald das eigentliche Problem mit dem Zeiger auf die Objekte Klasse Ort gelöst ist.
DA stehe ich nach wie vor auf dem Schlauch.Der Header:
class ListeKnoten{ private: sting info; // ggf. mehr Dateb ListeKnoten *next, *pre_pos, // Vorgänger des Positionszeigers *anfang; // Zeiger auf den Anfang der Liste public: ListeKnoten (const string Data ListeKnoten *next = NULL, ListeKnoten *pre_pos = NULL, ListeKnoten *anfang = NULL); NewElement *Insert (const string Data);
Soweit der Header - nun der Body der Class:
ListeKnoten::ListeKnoten (const string Data, ListeKnoten *next, ListeKnoten *pre_pos, ListeKnoten *anfang) { info = Data; next = next_loc; pre_pos = pre_pos_loc; anfang = anfang_loc; } NewElement *ListeKnoten::Insert (string Data) { ListeKnoten *NewElement; NewElement = new ListeKnoten (Data, next, this, anfang); next = NewElement; return next; }
Edit:
- return-Value vergessen
- Wozu dient eigentlich dieser anfang-Pointer?
-
So kannst du neue Orte anlegen (info : Orte *NeuOrt)
void ins(string i, int x, int y) { struct knoten *p = new knoten; p->next = pos; p->NeuOrt = new Orte(i,x,y); if (anfang == NULL) anfang = p; if (pre_pos != NULL) pre_pos->next = p; else anfang = p; pos = p; anzahl++; } ... };