Array und Klassen



  • Ja, das ist ein Array aus Pointern (zumindest mache ich das immer so) 😃

    Bedeutet das hier, pMitglieder=new CMitglieder*[m_iAnzahl]; oder void CVerein::add(CMitglieder *Mitglied), ein Pointer erwartet wird?

    Genau. Der Funktion "add" wird ein Pointer übergeben, um das Problem mit dem Destruktor zu lösen; und dieser Pointer wird in dem Array gespeichert.

    Die Objekte legst du dann so an:

    CVerein verein;
    CMitglieder* MitgliedNr1 = new CMitglieder();
    CMitglieder* MitgliedNr2 = new CMitglieder();
    
    verein.add(MitgliedNr1);
    verein.add(MitgliedNr2);
    

  • Administrator

    @DarkShadow44,
    1. Wozu diese Klammern? Die sind völlig unnötig.
    2. Dein präsentierter Code erfüllt die Aufgabenstellung nicht mehr. Es steht explizit, dass Objekte von Mitglieder gespeichert werden müssen und nicht Zeiger davon. Zudem soll das übergebene Objekt ans Ende des Array kopiert werden und nicht ein Zeiger darauf gespeichert.
    3. Bitte Intialisierungslisten im Konstruktor verwenden.
    4. Du brauchst ein unnötiges temporäres Array zuviel.
    5. Dein Vorgehen ist sehr verwirrend für jeden, welcher die Klasse verwenden würde, da die Besitztverhältnisse nicht klar sind. Verein ist eine Art von Containerklasse, verhält sich aber überhaupt nicht so, was die Besitzverhältnisse betrifft.

    @franz-21,
    Die grundsätzliche Vorgehensweise über das temporäre Array, wie es Darkshadow44 gemacht hat, ist schon korrekt. Aber naja, es stimmt einiges anderes überhaupt nicht.

    class Verein
    {
    private:
      Mitglied* m_mitglieder;
      int m_anzahl;
    
    public:
      Verein();
      ~Verein();
    
      void add(Mitglied const& mitglied);
    };
    
    Verein::Verein()
      : m_mitglieder(NULL)
      , m_anzahl(0)
    {
    }
    
    Verein::~Verein()
    {
      delete[] m_mitglieder;
    }
    
    void Verein::add(Mitglied const& mitglied)
    {
      Mitglied* altMitglieder = m_mitglieder;
      m_mitglieder = new Mitglied[m_anzahl + 1];
    
      for(int i = 0; i < m_anzahl; ++i)
      {
        m_mitglieder[i] = altMitglieder[i];
      }
    
      m_mitglieder[m_anzahl] = mitglied;
      ++m_anzahl;
    
      delete[] altMitglieder;
    }
    

    Damit die Klasse Verein noch sinnvoll verwendet werden kann, musst du noch einen Zuweisungsoperator und den Kopierkonstruktor dafür schreiben.

    Grüssli



  • Hab jetzt nocheinmal im Buch zurückgeblättert und finde nichts zu Zuweisungsoperatoren. Habe mir einen gegoogelt, nur wie ist der zu interpretieren?

    void operator=(const Vector &derAndereVector)  //für was steht operator= ?
       {
          delete[] m_data;
          m_size=derAndereVector.m_size;
          m_data=new double[m_size];
          for(int i=0;i<m_size;++i)
             m_data[i]=derAndereVector.m_data[i];
       };
    

  • Administrator



  • Der wird aufgerufen bei

    Vector a;
    Vector b;
    //tuwas
    b=a;//<--Hier
    


  • 1. Wozu diese Klammern? Die sind völlig unnötig.

    Ups. Keine Ahnung warums vorhin ohne nicht ging 🤡

    Dein präsentierter Code erfüllt die Aufgabenstellung nicht mehr. Es steht explizit, dass Objekte von Mitglieder gespeichert werden müssen und nicht Zeiger davon. Zudem soll das übergebene Objekt ans Ende des Array kopiert werden und nicht ein Zeiger darauf gespeichert.

    Sorry, habe ich überlesen.

    3. Bitte Intialisierungslisten im Konstruktor verwenden.

    Warum ? Die Anzahl muss 0 werden und der Pointer NULL.

    4. Du brauchst ein unnötiges temporäres Array zuviel.

    Da denke ich zu kompliziert 😃

    Verein ist eine Art von Containerklasse, verhält sich aber überhaupt nicht so, was die Besitzverhältnisse betrifft.

    Wie meinst du das ?



  • Wie würde den so ein Zuweisungsoperator für mein Beispiel aussehen, oder kann mir wer eine gutes Tutorial empfehlen? Kappier das noch nicht ganz



  • Dravere schrieb:

    Überladung von Operatoren in C++

    Grüssli



  • Ich mein mit Übungen, das ist ein Bisschen trocken



  • Was für Übungen? - Da hats Beispielcode. Reicht dir das nicht?



  • franz-21 schrieb:

    Ich mein mit Übungen, das ist ein Bisschen trocken

    Wenn du so willst, ist C++ trocken. Operatorüberladung ist nämlich reines C++, und Theorie gehört eben dazu.


Anmelden zum Antworten