Vektor für Objekte einer Klasse -Gelöst-
-
#include <iostream> #include <string> #include <vector> using namespace std; class foo { public: int Anzahl; }; int main() { vector<foo>test; for(size_t i=0;i<10;++i) { test[i].Anzahl=50; } return 0; }Ich möchte gerne einen Vektor für Objekte einer Klasse anlegen.
Das Codebeispiel funktioniert leider nicht, nehme ich statt des Vektors ein Array, ist alles in Ordnung. Oder wenn ich dem Vektor eine feste Anzahl von Elementen zuweise (z.B. 10), geht es auch. Was mache ich falsch?
-
Du musst in den Vector auch was reinpacken, bevor du darauf zugreifen kannst. Elemente automatisch erzeugen tut nur die (multi)map (das ist aber sicherlich nicht das was du möchtest). Um Elemente in den vector zu packen gibt es sehr viele Methoden. Am meisten benutzt werden vermutlich (ganz grob danach sortiert, wie oft sie mir begegnen):
- push_back
- Erzeugung einer bestimmten Zahl von Elementen direkt im Konstruktor
- Vergrößerung mit resize
- Zuweisung einer Reihe von Elementen im Konstruktor
- Zuweisung einer Liste von Elementen (ab C++11)
- Einfügen mit insert
- Inhaltsänderung mit assignUnd das waren nicht einmal alle.
-
Dachte, daß durch
test[i].Anzahl=50;jedem Objekt des Vektors der Wert 50 zugewiesen wird.
Man könnte natürlich auch erstmal ein Objekt erzeugen, den Wert zuweisen und es dann mit push_back in den Vektor speichern.
-
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
