Dynamisches Klassenarray um Instanzen einer Klasse zu verwalten
-
wüst schrieb:
Warum soll er nicht selbst was auf die Beine stellen. Ist ja noch in der Lernphase.
Der Ansatz ist doch ganz falsch.
Wenn er lernen will, soll er erstmal einen vector für int oder so schreiben. Denn
void ladePerson(CString Dateiname); void schreibePerson(CString Dateiname); void SetName(CString Name); void SetAlter(int Alter);
haben in der Array Klasse ja nichts zu suchen.
Man müsste sich erstmal klar werden was man will. Soll PersonenArray ein vector sein oder lieber nur ein 'iterator' der seine eigene sequence hat.
Das denke ich, ist aber zu kompliziert, deshalb lieber erstmal einen einfachen vector.
wenn es aber nur um die Lösung des Problems, ich habe 10 Personen, wie speichere ich die vernünftig in ein Array geht, dann wäre vector/list/etc. besser
-
Da ist ein prinzipieller Fehler im Design deiner Klasse PersonenArray.
Die Klasse PersonenArray verwaltet mehere Instanzen der Klasse Person Daher würde ich eher so ein Interface vorschlagen.class PersonenArray { public: void ladePerson(CString Dateiname); void schreibePerson(int index, CString Dateiname); void SetName(int index, CString Name); void SetAlter(int index, int Alter); //eigentlich benötigte Funktionen private: Person *personen; //dynamisches Array von Personen // oder noch besser vector<Person> personen; void vergroessere(int groesse); // nicht notwendig bei vector<Person> Person * getPerson( int index ); }; // implementation z.B void PersonenArray::SetName(int index, CString Name) { getPerson(index)->SetName(Name); }
K.
-
Shade Of Mine schrieb:
btw: lass die MFC mal hinter dir
Da hab ich leider keine andere wahl. Ich muss in MFC programmieren weil alle unsere Projekte in MFC programmiert sind. Wenn ich da mit vector<Person> ankomme dann würde mich mein Chef fragen was das soll und warum ich kein CString oder CStrinArray nehme und das das doch so viel besser ist usw....
Shade Of Mine schrieb:
Soll PersonenArray ein vector sein oder lieber nur ein 'iterator' der seine eigene sequence hat
Hm 'iterator' sagt mir nichts. PersonenArray soll ein (selbstprogrammierter) vector werden. Ein vector ist ja auch nichts anderes als ein Dynamisches Array.
Ich hab aber auch noch einen Fehler gemacht. Am ende soll man nicht
PersonenArray.SetName("Karl");
machen sonden,
[cpp]PersonenArray.AddNeuePerson(sName); //neue Instanz anlegen
PersonenArray**[i]**.SetName("Neumann"); //zugriff wie über ein Array auf die i'te Instanz, auf das i'te Feld[/cpp]
Mein Ziel ist es, das man es von aussen für eine Art CStringArray hält. (mit Array.Add(bla) werden neue Felder/Instanzen angelegt und mit Array[i].macheWas() erfolgt der Zugriff darauf).
-
mir kommt da grad eine Idee... Müsste man da nicht den operator [] definieren?
das wär dann so hier:
CPerson* PersonArray::operator[]() const { return person; }
und ich bräuchte nur die Funktionen die sich um die größe des Arrays kümmern. Liege ich da richtig?
-
Chris++ schrieb:
mir kommt da grad eine Idee... Müsste man da nicht den operator [] definieren?
das wär dann so hier:
CPerson* PersonArray::operator[]() const { return person; }
und ich bräuchte nur die Funktionen die sich um die größe des Arrays kümmern. Liege ich da richtig?
Richtige Idee, falsche Ausführung
CPerson& PersonArray::operator[]( size_t index ) { // range_check? return personen[index]; } const CPerson& PersonArray::operator[]( size_t index ) const { // range_check? return personen[index]; }
-
Chris++ schrieb:
PersonenArray soll ein (selbstprogrammierter) vector werden.
Sorry, aber das ist doch irgendwie sinnbefreit. Wenn Du das professionell machst (im Sinne von Geld damit verdienen), dann ist es doch viel sinniger was fertiges zu verwenden als selber was zusammenzustoppeln. So gut wie der fertige vector wird's nicht werden, und länger dauert es auch noch.
Vielleicht gönnst Du Dir einfach mal ne halbe Stunde um Dich kurz mit vector auseinanderzusetzen. Du kannst das ganze ja dann in Deiner Klasse verstecken, sodaß keiner merkt was Du da benutzt hast. Aber Du wirst sehen, fast alle Deiner Mehtoden werden damit zum Einzeiler.
MfG Jester
-
eigentlich ist die nicht "const" Version vorzuziehen da die Objekt ja geändert werden sollen. Und statt "size_t" kann ich doch auch ein normales "unsingned int" nehmen oder?
-
@unsigned int: ja kann man.
-
Du kannst sogar char nehemen, wenn du magst. Macht dann aber nicht soviel Sinn.
-
Lies dir mal: http://tutorial.schornboeck.net/los/array_class.htm durch.
-
ok, danke euch. Ihr habt alle meine Fragen beantwortet