Vektor für Objekte einer Klasse -Gelöst-
-
redrew99 schrieb:
jedem Objekt des Vektors der Wert 50 zugewiesen wird.
Und wie viele Objekte sind in dem vector?
-
Dachte, 10, aber wenn ich das richtig verstehe, wohl leider keins.
Gibt es denn eine Möglichkeit, Vektoren zu erzeugen, die eine noch nicht bekannte
Anzahl von Objekten speichern können?
-
In deinem Code sind KEINE Objekte in dem Vector, weil du keine eingefügt hast.
-
redrew99 schrieb:
10
Und wo in dem Code sagst du, dass 10 Elemente in dem vector sind?
-
redrew99 schrieb:
10
Und wie sind die darein gekommen? Gucken wir doch mal die beiden Operationen auf den vector an, die in deinem Code sind:
vector<foo>test;Erstellt einen leeren vector.
Guck dir den Link auch an! Du hast die erste Variante des Konstruktors gewählt, also den mit dem Defaultargument.test[i].Anzahl=50;Das fügt auch nichts in den Vector ein, es greift auf bestehende Elemente zu. Da die Elemente auf die du zugreifst nicht da sind, gibt es Probleme.
-
Stimmt. Eigentlich auch sehr logisch.
Hatte das irgendwie (fragt nicht wie...) mit push_back verwechselt, sry.for(size_t i=0;i<10;++i) { foo s; s.Anzahl=50; test.push_back(s); }So müßte man es dann schreiben können, wenn das Objekt nur innerhalb der Schleife
existieren soll.Danke für die Hilfe nochmal

-
redrew99 schrieb:
wenn das Objekt nur innerhalb der Schleife
existieren soll.ist zwar richtig, spielt aber keine rolle, wie lang das existiert - kopiert wird es so und so. hast dus in deinem code auch so oder umständlicher geschrieben? ich tippe mal fast auf 2.^^
-
In meinem Code hatte ich das zuerst genauso geschrieben.
Ich habe allerdings das Problem, daß das Objekt auch abhängig von anderen Bedingungen (z.B. einem Zähler) zerstört werden soll.
#include <iostream> #include <string> #include <vector> using namespace std; class foo { public: int Anzahl; }; int main() { vector<foo>test; for(size_t i=0,z=0;i<10;++i,++z) { foo *s=new foo; if(z==5) { delete s; continue; } else { s->Anzahl=50; test.push_back(*s); delete s; } } return 0; }Weiß nicht genau, ob es sinnvoll ist, das Objekt auf dem Heap anzulegen, eine
andere Idee ist mir bislang nicht eingefallen.
-
redrew99 schrieb:
...
Weiß nicht genau, ob es sinnvoll ist, das Objekt auf dem Heap anzulegen, eine
andere Idee ist mir bislang nicht eingefallen.Auf dem Stack ist es wesentlich besser aufgehoben, wenn du auch noch einen sinnvollen Konstruktor spendierst, kannst du den Code sogar noch weiter verkürzen.
// Erste Variante mit Kommentaren
#include <vector> using namespace std; class foo { public: int Anzahl; }; int main() { vector<foo>test; for(size_t i=0,z=0;i<10;++i,++z) { // foo *s=new foo; => Dein Vektor enthält Objekte, keine Zeiger, warum also new? foo s; if(z==5) { // delete s; => Ohne new auch nicht nötig... continue; } else { // s->Anzahl=50; s.Anzahl=50; test.push_back(s); // delete s; } } return 0; // Kannst, musst du aber bei int main nicht schreiben (wird automatisch gemacht)... }// Kürzere Variante dank Konstruktor und umgedrehter Logik...
#include <vector> using namespace std; class foo { public: foo(int anzahl = 0) : Anzahl(anzahl) {} int Anzahl; }; int main() { vector<foo>test; for(size_t i=0,z=0;i<10;++i,++z) if(z!=5) test.push_back(foo(50)); }
-
asc schrieb:
// foo *s=new foo; => Dein Vektor enthält Objekte, keine Zeiger, warum also
new?Stimmt natürlich. Ich war fälschlicherweise davon ausgegangen, daß nach dem
continue das Objekt bestehen bleibt, was natürlich Quatsch ist.asc schrieb:
Auf dem Stack ist es wesentlich besser aufgehoben, wenn du auch noch einen sinnvollen Konstruktor spendierst, kannst du den Code sogar noch weiter verkürzen.
// Kürzere Variante dank Konstruktor und umgedrehter Logik...#include <vector> using namespace std; class foo { public: foo(int anzahl = 0) : Anzahl(anzahl) {} int Anzahl; }; int main() { vector<foo>test; for(size_t i=0,z=0;i<10;++i,++z) if(z!=5) test.push_back(foo(50)); }Jupp, sieht gut aus. Danke für die Hilfe
