Verwaltung von dynamsichen Objekten
-
Folgendes Problem:
Ich habe eine Klasse List, die eine dynamische Anzahl Objekte einer Klasse Object verwalten soll. Dabei soll es die Funktionen Add und get geben:
class List{ public: ... int Count; void Add(AnsiString Name); Object *Get(int Index); private: Object *CurrObject; int Top; }; class Object{ public: Object(void); ~Object(void); AnsiString Name; };
Object *List::Get(int Index) { return &CurrObject[Index]; } void List::Add(AnsiString Name) { *CurrObject = new Object()[Top]; CurrObject->Name = Name; Top++; Count++; }
Ich kann problemlos Objekte hinzufügen, jedoch bekomme ich mit Get nur das zuletzt hinzugefügte korrekt zurückgegeben. Wo liegt der Denkfehler?
PS: Will keine list/stack/vector etc benutzen...
-
hi,
dies ist meine Lösung deines Problems..btw, wo sind deine vorherigen Objekte denn hin, wenn du ein neues Feld mit new einrichtest?
Dort liegt der Fehler meiner Meinung nach#include <iostream> #include <string> using namespace std; class Object; //LIST class List { public: List():Count(0),Top(0){} int Count; void Add(string Name); Object* Get(int Index); private: Object* CurrObject; int Top; }; void List::Add(string Name) { Object *pTmp=new Object[Count+1]; for(int i=0;i<Count;++i) pTmp[i]=CurrObject[i]; pTmp[Count].Name = Name; CurrObject=pTmp; Top++; Count++; } //----------------------------------- //OBJECT class Object{ public: Object(){} ~Object(){} string Name; }; Object *List::Get(int Index) { return &CurrObject[Index]; } //----------------------------------- int main() { string s; List l; Object *pO; while(1) { cin>>s; if(s=="eof")break; l.Add(s); } // for(int i=0;i<l.Count;++i) // cout << l.Get(i)->Name << endl; return 0; }
...aber warum willst du es nicht mit list,vector,etc. machen, das ist doch viel komfortabler, und warum das Rad zweimal erfinden
?
naja, ich hoffe, ich konnte dir helfen
mfg _mika_
-
__gast schrieb:
... *CurrObject = new Object()[Top]; ...
du legst also ein neus array dynamisch an und speicherst dessen adresse in CurrObject. und was passiert mit dem alten? du verlierst es im speicher! wenn du das schon unbedingt mit arrays machen willst musst du zuerst ein neues anlegen und den zeiger darauf in einer temporären variable speichern, dann die daten umkopieren, dann das alte array löschen und dann CorrObject auf das neue array zeigen lassen.
dabei muss aber eben bei jedem hinzufügen alles umkopiert werden und das bedeutet viel laufzeit. viel schöner wär eine verkettete liste.
schau dir das mal an:http://www.volkard.de/vcppkold/verkettete_liste.html