dynamischer struct in einer klasse
-
kann ich die grösse eines privaten struct-array attribut einer klasse erst mit dem konstruktor bekanntmachen? wenn ja, wie?
bsp:
class foo { private: struct bar { int x; int y; }; struct bar dings; // dieses dings soll mit dem konstruktor zu einem array werden public: foo(int); }; foo::foo(int groessedesdings) { dings = new dings[groessedesdings]; // irgendwie so müsste das doch gehen, nur wie genau? }
[edit]
ach hat sich gerade geklärt...
dings = new bar[groessedesdings];und dings muss ein pointer sein, warum eigentlich? ich weiss alle elemente die mit new erzeugt werden, müssen pointer sein, aber wieso genau?
[/edit]
-
class foo { private: struct bar { int x; int y; }; bar * dings; // dieses dings soll mit dem konstruktor zu einem array werden public: foo(int); }; foo::foo(int groessedesdings) { dings = new bar [groessedesdings]; // irgendwie so müsste das doch gehen, nur wie genau? }
Empfehlen würde ich aber:
std::vector<bar> dings;
Da kannste mit size() die größe ermitteln (wieviel is drinn )
push_back() ein Element einfügen
und [] auf die Elemente zugreifen.Du musst Dich dann nicht mehr auf den Speicher konzentrieren. (new und delete krempel)
-
gz schrieb:
und dings muss ein pointer sein, warum eigentlich? ich weiss alle elemente die mit new erzeugt werden, müssen pointer sein, aber wieso genau?
[/edit]ganz einfach: weil new eine speicheradresse liefert
Du könntest die adresse zwar in ne referenz speichern (verbessert mich wenn ich falsch liege) aber aus der referenz bekommst du die adresse später nichtmer heraus -> speicherleck da delete wiederum ne adresse erwartet
-
Oi!
Du kannst Doch nich zum gleichen Zeitpunk Editieren wo ich Antworte.
PÜH!Du, wenn Du std::vector nimmst brauchst kein delete mehr
void fn1(std::vector<bar> & foo) { // Hier was mit foo machen } { std::vector<bar> foo; // bla bla bla fn1(foo); } // hier wird foo zerstört weil aus dem Sichtbarkeitsbereich
Aber drauf achten:
Wenns vector<bar*> foo; heisst musste dennoch alle bars* löschen und
vector<bar> foo; erzeugt beim Einfügen eine Kopie von bar.
-
danke für euere antworten!
wieder was gelerntgz
-
THE_FreaK schrieb:
gz schrieb:
und dings muss ein pointer sein, warum eigentlich? ich weiss alle elemente die mit new erzeugt werden, müssen pointer sein, aber wieso genau?
[/edit]ganz einfach: weil new eine speicheradresse liefert
Du könntest die adresse zwar in ne referenz speichern (verbessert mich wenn ich falsch liege) aber aus der referenz bekommst du die adresse später nichtmer heraus -> speicherleck da delete wiederum ne adresse erwartetZwar nur aus dem Draft, aber ich denke daran hat sich nichts geaendert:
5.3.4 New [expr.new]
1 The new-expression attempts to create an object of the type-id
(_dcl.name_) to which it is applied. This type shall be a complete
object type, but not an abstract class type or array thereof
(_intro.object_, _basic.types_, _class.abstract_). [Note: because
references are not objects, references cannot be created by new-
expressions. ] [Note: the type-id may be a cv-qualified type, in
which case the object created by the new-expression has a cv-qualified
type. ]mfg
v R