Im Konstruktor andere Objekte erzeugen?
-
Ich versteh nicht, warum das mit array oder vector noch sein muss, wenn ich auf Pointer verzichte. Vielleicht versteh ich das, wenn ich die ANtworten zu 1)-3) weiß...
-
susie schrieb:
- Wann würden die Objekte erzeugt bzw. wo muss ich deren Instanzvariablen belegen? Reicht das im Konstruktor?
Objekte werden immer sofort erzeugt. Ich weis nicht wie genau du das meinst. Bei einem
std::vector<int> v(5)werden sofort 5 int-Objekte erzeugt. Bei einem
std::vector<int*> v(5)werden sofort 5 Point-auf-int-Objekte erzeugt. Die ints selbst muss man natürlich noch mal separat erzeugen, wenn man die haben will. Aber grundsätzlich funktioniert das alles immer gleich.
susie schrieb:
- Die meisten Klassen der Objekte (ich nenn es mal Gridelement-Klassen) haben nur doubles oder doubles,floats und bools als Instanzvariablen. Eine Gridelement-Klasse hat aber auch Pointer auf eine Klassenhierarchie als Instanzvariable, die manchmal belegt sind, manchmal nicht (Nullpointer). Geht das dann auch? Denn dann hätt ich ja in der Gridelementklasse auch wieder Pointer drin...
Äh was?^^
susie schrieb:
- Eine der Gridelement-Klassen hat 45 doubles als Instanzvariable. Wenn ich nun ein Grid mit 100x100 oder gar 500x500 nehme, geht das dann speichertechnisch?
DAnke nochmal!
Ne, 500*500*45*8 sind ca 85 MB, das sollte man auf den Heap legen. Daher ja vector<>, der macht das schon gut alleine.
-
cooky451 schrieb:
susie schrieb:
- Die meisten Klassen der Objekte (ich nenn es mal Gridelement-Klassen) haben nur doubles oder doubles,floats und bools als Instanzvariablen. Eine Gridelement-Klasse hat aber auch Pointer auf eine Klassenhierarchie als Instanzvariable, die manchmal belegt sind, manchmal nicht (Nullpointer). Geht das dann auch? Denn dann hätt ich ja in der Gridelementklasse auch wieder Pointer drin...
Äh was?^^
Das wäre auch wieder ein Fall für SmartPointer, damit die Objekte, auf die diese Pointer zeigen, auch aufgeräumt werden, wenn die Gridelemente bzw. der vector gelöscht werden.
Notfalls sonst halt in den Destruktoren der Gridelemente.
-
cooky451 schrieb:
- Die meisten Klassen der Objekte ...
Äh was?^^
Ja, war da etwas umständlich ausgedrückt. Hier nochmal der vorige BEitrag, wo dasselbe klarer steht:
http://www.c-plusplus.net/forum/p2272109#2272109cooky451 schrieb:
- Wann würden die Objekte erzeugt bzw. wo muss ich deren Instanzvariablen belegen? Reicht das im Konstruktor?
Objekte werden immer sofort erzeugt. Ich weis nicht wie genau du das meinst.
Ich nehm mal den schwierigsten Fall von grade, jetzt halt nicht mit Pointern:
class Landscape { CellInformation cellInfo[xsize][ysize]; }CellInformation enthält aber wie gesagt seinerseits wieder Pointer.
Wenn ich jetzt ein Objekt der Klasse Landscape erzeuge (mit new), würden in dem Augenblick (per Konstruktor?) Objekte von CellInformation erzeugt? Die Instanzvariablen eines CellInformation-Objekts sind teilweise int, würden dann zufällige Werte drin stehen? Aber schwieriger: manche Instanzvariablen eines CellInformation-Objekts sind Pointer. Was würde da drinstehen? Bisher hieß es immer (in anderem THread hier), wenn ich ein Objekt erzeuge, muss ich sofort alle Instanzvariablen initialisieren und die Pointer auf Null setzen. Soll ich das dann machen oder ist das nicht dasselbe, wie wenn das Grid aus Pointern besteht, die ich auf Null setze?!
Sorry, falls ich mich kompliziert ausdrücke, bin selbst grad durcheinander und ich weiß nicht besser, wie ich beschreiben kann, was ich meine.
-
susie1 schrieb:
Sorry, falls ich mich kompliziert ausdrücke,
Sorry, falls ich mich jetzt kurzfasse, aber das sind alles Sachen, die man sehr schön in einem guten Grundlagenbuch nachlesen kann. Z.B. in Breymanns "Der C++ Programmierer", wo es auch Beispiele zu zwei- und dreidimensionalen Arrays mit Vektoren gibt.