Dynamisches Klassenarray um Instanzen einer Klasse zu verwalten
-
Hallo
wie der Titel schon sagt will ich mir ein Array basteln was die Instanzen einer anderen Klasse verwaltet.
Die andere Klasse ist eine Speicherklasse die z.B. Personen verwalt. Also mit Personenname, Alter usw... sie sieht in etwa so aus.class Person //vereinfachte version { public: void ladePerson(CString Dateiname); void schreibePerson(CString Dateiname); void SetName(CString Name); void SetAlter(int Alter); private: CString m_Name; int m_Alter; };
jetzt möchte ich mir wie gesagt eine weitere klasse schreiben die die Personen klasse dynamisch verwaltet. Einen Vector also. Allerdings müsste ich (mit meinem jetztigen Wissensstand) für jede Funktion in der "Person"-Klasse eine Funktion in der "PersonenArray"-Klasse schreiben die eigentlich nur die Funktion der entsprechenden Instanz aufruft.
[cpp]
class PersonenArray //vereinfachte version
{ public:
void ladePerson(CString Dateiname);
void schreibePerson(CString Dateiname);
void SetName(CString Name);
void SetAlter(int Alter);
//eigentlich benötigte Funktionen
void vergroessere(int groesse);
private:
CPerson *personen; //dynamisches Array von Personen
};
//um die Funktion der einzelnen "Person"-Funktionen auszuführen muss ein Art "Maske"
//her, die die entsprechenden Werte übermittelt
void PersonenArray::SetName(CString Name)
{
personen->SetName(Name);
}
[/cpp]
Wie ich das personen-Array vergrößere steht ja im Tutorial von Volkard beschrieben.
Was mich jetzt interessiert ist, ob ich diese "Masken"-Funktionen irgendwie übergehen kann. Sodass im Quellcode beiPersonenArray.SetName("Karl");
direkt die Funktion aus der "Person"-Instanz aufgerufen wird und ich in der "PersonenArray" Klasse wirklich nur prüfen muss wie groß der vector gerade ist usw.
Ich bin für jede Hilfe dankbar (Links, Tutors, etc...).
Gruß Chris++
-
sicher dass du nicht einfach vector<Person> oder list<Person> stattdessen haben willst?
btw: lass die MFC mal hinter dir
-
Du kannst den operator.() und operator->() für deine Arrayklasse definieren, die in etwa so aussehen:
CPerson* PersonArray::operator->() const { return person; }
CPerson& PersonArray::operator.() const { return *person; }In main rufst du dann array.machwas() auf und es wird sich indirekt auf CPerson beziehen.
-
Shade Of Mine schrieb:
sicher dass du nicht einfach vector<Person> oder list<Person> stattdessen haben willst?
btw: lass die MFC mal hinter dir
Warum soll er nicht selbst was auf die Beine stellen. Ist ja noch in der Lernphase.
-
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