PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++: dynamisch Objekte erstellen/verwalten


Marscel
2005-08-06, 19:30:18
Ein wenig Vertiefung in C++ sah ich gerade mal angebracht...

Angenommen, ich hab eine Klasse und will nun per Knopfdruck beliebig Objekte dieser Klasse erstellen/bearbeiten/löschen, allerdings müssen die Objekte auch so bezeichnet sein sein, dass ich genau weiß, um welches es sich handelt, praktisch soll jedem Objekt eine Nummer zugeordnet werden, die immer wieder inkrementiert wird, etwa so (das soll nur das Prinzip darstellen):

Objekt1, Objekt2, Objekt3 ...

Das Problem ist, dass ich nicht weiß, wie man das im Code umsetzen soll (möglichst ohne Makros). Mithilfe von Arrays kann man ja unter einem Bezeichner n Objekte erstellen (Klasse Object[n]; ), deren Indizierung praktisch eine Nummerierung ist, mit der sich eigentlich ganz gut arbeiten lässt, wenn man ein bestimmtes Objekt herraussuchen will. Nun habe ich aber keinen einfachen Weg unter C++ gefunden, mit dem man neue Elemente in ein Array dranhängen kann (etwa wie bei PHP mit arraypush()) bzw. auch Elemente an Index x aus dem Array wieder herausnehmen kann. Weiter habe ich mit einem n "großen" Array auch nur die Möglichkeit n Elemente darin unterzubringen und wenn man nicht alle Elemente bzw. hier Objekte braucht, ist sowas Speicherverschwendung, das Array sollte also "dynamisch" groß sein.

Bevor ich weiterfrage, kann man das Schema überhaupt auf diese Art und Weise umsetzen oder ist das ganze, was ich mir an Sorgen mache, vielleicht überflüssig, d.h. eigentlich übersehe ich was einfacheres oder gibt es da andere Möglichkeiten?

MIR fallen keine anderen Wege außer den Arrays ein, die man dann mithilfe eigener Funktionen bearbeiten müsste. Knotenlisten würde ich auch noch als Mittel ansehen, wobei ich dort genauso wenig weiß, wie sich die einzelnen Listeneinträge bzw. Knoten auslesen lassen.

Mir geht es in erster Linie darum, dynamisch beliebig Objekte einer Klasse erstellen/löschen zu können und jedes einzelne wiederfinden zu können.

Für Tipps und Gedankenanstöße wäre ich dankbar.

Neomi
2005-08-06, 20:02:00
Du könntest dir eine Templateklasse schreiben, die wie ein Array eines beliebigen Typs (deshalb ein Template) angesprochen wird und den Speicher für die Objekte darin verwaltet. Der Arrayzugriffsoperator [] kann recht simpel überladen werden.

Trap
2005-08-06, 20:14:18
Du könntest auch einfach <vector> oder <map> includieren und std::vector oder std::map benutzen. std::vector macht das was die PHP-Arrays auch machen (glaub ich zumindest, ich kenn PHP nicht im Detail), std::map speichert (Schlüssel, Wert)-Paare.

maximAL
2005-08-06, 21:06:59
Nun habe ich aber keinen einfachen Weg unter C++ gefunden
dann solltest du dir mal ein neues buch zulegen (!?!).
die standard-bibliothek bietet für sowas reichlich möglichkeiten.
zum einen kannst du eine verkettete liste (std::list) benutzen, in die du neue elemente immer einhängst. allerdings kannst du die liste der objekte dann nur eins nach dem anderen durchlaufen, also nicht per index darauf zugreifen.
wenn du unbedingt den index brauchst, dann nimm einen vector (std::vector). im grunde ein array, welches funktionen mitbringt um dynamisch neue elemente anzuhängen etc.
hier (http://www.cppreference.com/) gibts ne kurze übersicht über die standard bibliothek.

natürlich kann man sich solche sachen auch selbst schreiben, was für dich als totalen anfänger sicher ne sinnvolle übung wäre...

Marscel
2005-08-06, 21:57:49
dann solltest du dir mal ein neues buch zulegen (!?!).


Mein einziges geht leider nicht auf mehr als <iostream> und ein wenig <string> ein. :rolleyes:
Bevor ich wieder 30 € hinblättere, versuche ich mich im Internet zu informieren, etwa wie auf deiner verlinkten Seite.

Vektoren, Listen und Maps sehen recht interessant aus...

Gast
2005-08-06, 22:58:47
Wie viele von deinen Objekten willst du denn verwalten? Wenns nicht gar viele sind (<1000) nimm std::list. Oder das einfach verkettete Pendant dazu.

Marscel
2005-08-06, 23:44:20
Das weiß ich nicht, ich will erstmal nur per Knopfdruck sagen können, erstelle ein Objekt und änder z.B. die Farbe und lösche es wieder.

Coda
2005-08-07, 13:07:18
Es gibt keine effiziente Datenstruktur die Objekte in der Mitte löschen kann und Zugriff per Indizierung zulässt.

Entweder man kann indizieren und nicht in der Mitte löschen (std::vector, std::deque) oder in der Mitte löschen und nicht indizieren (std::list).

Bei PHP ist das nicht so tragisch weil da die Laufzeit eher durch den Interpreter limitiert wird, aber bei C++ werden solche ineffizienten Methoden nicht angeboten.

Du müsstest praktisch eine std::list nehmen und dort n-mal std::list::begin inkrementieren, also Laufzeit O( n ) für den Zugriff.

maximAL
2005-08-07, 13:42:51
coda, hör doch auf die newbies zu verwirren.
ein vector oder auch ne map passt hier ganz gut, effizienz ist wohl nicht unbedingt das thema.

Coda
2005-08-07, 13:58:03
Ein vector passt nicht wenn er Elemente in der Mitte löschen will und eine map ist nicht (linear) indizierbar.

maximAL
2005-08-07, 13:59:29
Ein vector passt nicht wenn er Elemente in der Mitte löschen will
wieso das? ok, es ist langsam...

Coda
2005-08-07, 14:08:55
Es gibt keine Funktion dafür. std::copy und ein pop_back() ist zwar prinzipiell möglich aber a) langsam und b) fehleranfällig bzgl. copy-constructor.

maximAL
2005-08-07, 14:17:57
http://www.cppreference.com/cppvector/erase.html :|

Coda
2005-08-07, 14:21:30
Es gibt erase für vector? Halte ich für ziemlich unsinnig, aber gut...

Ist halt O( n ), es gibt sicher in den meisten Fällen bessere Wege seine Daten so zu verwalten, dass es mit std::list geht.

Punkt b) trifft aber trotzdem zu, weil es genau das gleiche macht was ich gesagt habe.

maximAL
2005-08-07, 14:36:38
Es gibt erase für vector? Halte ich für ziemlich unsinnig, aber gut...

Ist halt O( n ), es gibt sicher in den meisten Fällen bessere Wege seine Daten so zu verwalten, dass es mit std::list geht.
imho kann man das nicht so pauschal sagen. ob ein vector als dynamische datenstruktur wirklich langsamer als ne list ist hängt von so einigen faktoren ab. und ist hier imho egal.

Coda
2005-08-07, 16:58:21
Also löschen eines Elements ist auf jeden Fall langsamer bei einem vector, weil alles dahinter kopiert werden muss.

maximAL
2005-08-07, 17:02:33
Also löschen eines Elements ist auf jeden Fall langsamer bei einem vector, weil alles dahinter kopiert werden muss.
stimmt. aber es kommt halt drauf an, wie oft man elemente löscht, wie wichtig wahfreier zugriff ist (liste travesieren = langsam) etc. pp.

Trap
2005-08-07, 17:08:15
Es kommt drauf an was man genau mit der Datenstruktur macht. Wenn man sagt: Lösche alle Objekte für die f(x) wahr ist, sieht es schon wieder anders aus.

Solange alle Objekte auf dem Monitor dargestellt werden und per Benutzereingabe gelöscht werden ist es völlig egal mit welcher Datenstruktur man das macht, alle Verfahren sind schneller als die Verzögerung der Anzeige.