Kopieren von Objekten
-
Hallo,
wie kann ich Objekte kopieren? Ich dachte mir, ich könnte einfach sowas machen:
Cell* var1; Cell* var2; var1 = new BaseEl(param1, param2); var2 = var1;
Das scheint aber irgendwie nicht so richtig zu funktionieren. Mache ich da irgendwas falsch. (Cell ist ein abstrakte Basisklasse von BaseEl)
-
du kopierst das objekt ja nicht. vielmehr weist du dem einen pointer die gleiche adresse zu, wie den anderen.
richtig würde es so gehen (vorrausgesetzt, dein objekt hat nen cpy-ctor):Obj *a = new Obj; Obj *b = new Obj(*a);
Damit wird objekt b gemäs den informationen von a erstellt, also kopiert. in c gabs sowas wie memcpy, das wäre vergleichbar
-
Aha. Mein genaues Problem ist folgendes: Code:
void insert(Cell* cell_to_insert) { Cell* temp; Cell* temp2; if (lowest == NULL) { lowest = cell_to_insert; lowest->set_previous(NULL); lowest->set_next(NULL); } else if (lowest->get_number() > cell_to_insert->get_number()) { temp = lowest; lowest = cell_to_insert; lowest->set_previous(NULL); lowest->set_next(temp); temp->set_previous(lowest); } else { temp = lowest; if (temp->get_number() == 1) { cout << "test\n"; } while (true) { if (cell_to_insert->get_number() > temp->get_number()) { cout << "Nummer: " << temp->get_number() << "\n"; if (temp->get_next() != NULL) { cout << "ok\n"; temp2 = temp->get_next(); cell_to_insert->set_next(temp2); } else { cell_to_insert->set_next(NULL); } cell_to_insert->set_previous(temp); temp->set_next(cell_to_insert); break; } temp = temp->get_next(); } } }
Da füge ich Elemente in eine sortierte doppelt verkettete Liste ein. Wenn ich ein mit number 1 eingebe, funktioniert es. Wenn ich dann eins mit number 2 eingebe, funktioniert es auch (cout << temp->get_number() ist dann 1, also der number- Wert des Elements, an das ich das neue anhänge), wenn ich dann aber eins mit number 3 eingebe, funktioniert es nicht mehr (dann ist cout << temp->get_number() wieder 1 und es müßte ja 2 sein, da ein Element mit number = 3 ja hinter das mit number = 2 gehören müßte). Mir scheint, dass temp da nicht korrekt weiter suf das jeweils nöchstae Element gesetzt wird.
-
sry aber ich steig irgendwie da net durch. was ist dieses 'number'? wenn du in eine doppelt verketten listewas einfügen willst, musste doch nur 2 sachen prüfen:
- Listenende (1)
- Listenanfang (2)
trifft keins zu, biste mitten drin (3)
dann machste entsprechend die einfügeoperation:(1): neu->prev = last; neu->next = NULL; last->next = neu; (2): [start ist element von der Kontrollklassen, ein pointer auf das anfangsglied] neu->next = start; start->prev = neu; start = neu; (3): [pos ist ein pointer auf ein element, nach dem du einfügen willst] neu->next = pos->next; neu->prev = pos; pos->next->prev = neu;
sortieren der liste entweder nacher, oder zur einfügelaufzeit (also einfach soweit in der liste durchhanteln, bis du an die richtige stelle kommst) hoffe das stimmt so
-
Ja, klar das stimmt schon so. Das number ist ein Wert, den jedes Listenelement hat (bspw. 10, 3 , 40000 etc.). Das ist auch der Wert, nach dem sortiert wird. Ich will die Sortierung beim Einfügen gleich sicherstellen, also gleich an der richtigen Stelle einfügen. Dazu muss ich gucken, wo ich Einfügen muss (temp->get_number()). Genau das funktioniert aber nicht. In der Schleife beim dritten if- Block klappt's nicht. Ich füge als erstes ein Element mit number = 10 ein (-> erster if- Block), dann eins mit number = 300 (3. if- Block, einmal in die Schleife, temp->get_number = 10, also Einfügen nach Element mit number = 10), dann füge ich eins mit number = 3434 ein und jetzt geht's wieder nur einmal in die Schleife und das Element, nach dem eingefügt wird, hat number = 10. Also wird, sobald die Liste nicht leer ist und das neue Element einen number- Wert hat, der grösse als die der schon vorhandenen Elemente ist, immer nach dem ersten Element eingefügt. Das Problem ist also einfach, dass das Erkennen der richtigen Position zum Einfügen nicht funktioniert.
Marco
-
Ich bin ja auch völlig bescheuert
cell_to_insert->get_number() > temp->get_number()
ist natürlich immer schon sofort erfüllt. Wenn die bestehende List so aussieht:
1 2 3 4
ist natürlich 5 > 1 und nach dem Einfügen sieht's hatl so aus:
1 5 2 3 4
Ich bin im Moment aber echt zu blöd, mir was einfallen zu lassen, wie ich feststelle, dass 5 eben nach 4 gehört und nicht schon nach 1. Hat einer einen kleinen Tip?