Dynamisches Klassenarray um Instanzen einer Klasse zu verwalten



  • 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.

    http://www.c-plusplus.net/forum/viewtopic.php?t=82049





  • ok, danke euch. Ihr habt alle meine Fragen beantwortet 👍


Anmelden zum Antworten