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 ichfeld(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,
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] = groesseund
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 einfachfeld = 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