Fragen zu folgendem Konstruktor



  • Hallo,

    Ich arbeite mich gerade durch das Buch 'Einstieg in Visual C++ 2008' durch.
    Ich bin gerade bei 'dynamische Speicherverwaltung' und 'Destruktoren'.
    Die Übung die ich da machen soll habe ich nur zur Hälfte lösen können und deshalb habe ich mir mal die Lösungen auf der mitgelieferten CD angesehen.
    Da taucht folgender Konstruktor auf den ich nicht verstehe. Vielleicht könnte mir jemand erklären was der für eine Bedeutung hat.

    class DynIntFeld {
      int *feld;
      int groesse;
      int kapazitaet;
    
    public:
      DynIntFeld()
      : feld(new int[2]), groesse(0), kapazitaet(2)    <--- Verstehe ich nicht!!
      {}
    }
    

    grüße

    sub

    p.s.

    Ich habe da noch eine Frage:
    Muß ich eigentlich wenn ich eine Klasse.h erstelle eine Klasse.cpp erstellen?
    Oder kann ich alle Definitionen auch in die Klasse.h reinschreiben?



  • sub-elektro schrieb:

    Da taucht folgender Konstruktor auf den ich nicht verstehe.

    Stichwort -> Elementinitialisierer

    Muß ich eigentlich wenn ich eine Klasse.h erstelle eine Klasse.cpp erstellen? Oder kann ich alle Definitionen auch in die Klasse.h reinschreiben?

    es ist von Vorteil alles was Code ist in die CPP zu schreiben und in der H nur die Deklarationen stehen zu haben ... kannst aber auch alles in die H schreiben ... Probleme wirst Du bei größeren Projekte haben - wenn alles in H steht

    hand, mogel



  • Hallo,

    Danke erstmal!
    Die Lösung hat dann aber 2 Kontsruktoren mit Elementinitialisierer.

    class DynIntFeld {
      int *feld;
      int groesse;
      int kapazitaet;
    
    public:
      DynIntFeld()
      : feld(new int[2]), groesse(0), kapazitaet(2)
      {}
    
      DynIntFeld(int g)
      : groesse(g), kapazitaet(g) {
        feld = new int[groesse];
      }
      ~DynIntFeld() {
        delete[](feld);
      }
    

    So sehen die Konstruktoren/Destruktoren aus.
    Den 2. Konstruktor verstehe ich. So habe ich das auch gelöst, aber beim 1. verstehe ich

    feld(new int[2])
    

    nicht. Und wieso sthet hinter Kapazität in der Klammer keine 1 ?

    Könntest Du das bitte etwas genauer erklären?

    Grüße



  • weil feld ein Zeiger auf ein Int ist und keine ganze Zahl

    int *feld = new int[2]; // richtig
    int *feld = 1; // ungünstig
    


  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Nein, mogel, so hat der OT das nicht gemeint.

    Die initiale Kapazität wurde auf 2 gesetzt, also muß auch das Feld entsprechend dimensioniert werden.



  • Hallo,

    @Th69

    Ja genau das habe ich gemeint.
    Danke!

    Zusätzlich aber noch:

    Ich kenne diese Definition

    int *feld;
    feld = new int[xy];
    

    aber diese

    feld(new int[2])
    

    kenne ich nur, wenn feld eine Methode wäre.
    Ist die Bedeutung hier entsprecehend?
    Also:

    new int[2]
    

    ist quasi der Parameter des dynamischen Feldes feld und

    new int [0]/[1] = groesse
    

    und

    new int[2] = Kapazität
    

    ?!



  • Nein, ich glaube, du denkst zu kompliziert.

    Es werden einfach die drei Variablen initialisiert, d.h. Werte zugewiesen.
    Innerhalb eines Funktionsblockes würdest du einfach

    feld = new int[2];
    groesse = 0;
    kapazitaet = 2;
    

    schreiben.
    Und innerhalb der Initialisierungsliste schreibst du halt die Werte innerhalb der runden Klammern (ist also nur eine etwas andere Syntax).

    Und die 2 in eckigen Klammern ist halt der selbe Wert wie die Kapazität (sonst würde ja die Invariante(!) nicht gelten).

    Du könnest auch

    kapazitaet = 2;
    feld = new int[kapazität];
    groesse = 0;
    

    schreiben, d.h. die Reihenfolge verändern.

    Bei der Initialisierungsliste ist jedoch

    kapazitaet(2), feld(new int[kapazitaet]), groesse(0)
    

    SEHR fehleranfällig, da die Initialisierungsreihenfolge anhand der Memberreihenfolge vorgenommen wird (d.h. laut deiner Definition würde erst 'feld' initialisiert, aber 'kapazitaet' hätte noch keinen Wert zugewiesen bekommen und wäre daher zufällig.

    Als bessere Variante wäre daher die Definition einer Konstanten:

    class DynIntFeld
    {
      int *feld;
      int groesse;
      int kapazitaet;
    
      static const int InitCapacity = 2; // Anmerkung s. u
    
    public:
      DynIntFeld()
      : feld(new int[InitCapacity]), groesse(0), kapazitaet(InitCapacity)
      {}
    };
    

    Falls du einen älteren Compiler hast, mußt du evtl. auf enums ausweichen:

    enum { InitCapacity = 2 };
    

    So ich hoffe, ich habe jetzt alle 'Klarheiten' beseitigt 🙂



  • Hallo,

    Alles klar! Danke! Das habe ich verstanden!

    Grüße


Anmelden zum Antworten