<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[viele Instanzen erzeugen]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich habe eine Klasse namens Auto von der ich viele Instanzen erzeugen möchte.<br />
Mithilfe eines Arrays ginge das natürlich, aber da Autos auch jederzeit wieder entfernt bzw. neue hinzugefügt werden müssen, habe ich einen std::vector genommen.<br />
Mittels push_back() kann ich dann über eine bereits vorhandene Instanz Kopien davon erzeugen. Das ganze funktioniert aber nicht wie ich es mir vorgestellt habe.<br />
Die Instanzen werden anscheinend nicht erzeugt, sondern nur kopiert (Instanzenzähler bleibt auf 1).<br />
Kurz gesagt: Wie erzeuge ich eine große Anzahl Instanzen richtig und kann dann noch weitere hinzufügen und entfernen?</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;

int AnzAutos = 0;

int main()
{
	class Auto
	{
		public:
			int Geschwindigkeit;

			Auto()
			{
				AnzAutos++;
				Geschwindigkeit = 200;
			}
	};

	Auto Auto1;

	std::vector&lt;Auto&gt; Autosammlung;

	for(int i = 0; i &lt; 100; i++)
	{
		Autosammlung.push_back(Auto1);
	}

	std::cout &lt;&lt; &quot;AnzAutos = &quot; &lt;&lt; AnzAutos; // = 1
	std::cout &lt;&lt; &quot;\nAutosammlung[87].Geschwindigkeit = &quot; &lt;&lt; Autosammlung[87].Geschwindigkeit; // = 200

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/332965/viele-instanzen-erzeugen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 07:56:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332965.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 02 Jun 2015 21:04:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to viele Instanzen erzeugen on Tue, 02 Jun 2015 21:04:39 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich habe eine Klasse namens Auto von der ich viele Instanzen erzeugen möchte.<br />
Mithilfe eines Arrays ginge das natürlich, aber da Autos auch jederzeit wieder entfernt bzw. neue hinzugefügt werden müssen, habe ich einen std::vector genommen.<br />
Mittels push_back() kann ich dann über eine bereits vorhandene Instanz Kopien davon erzeugen. Das ganze funktioniert aber nicht wie ich es mir vorgestellt habe.<br />
Die Instanzen werden anscheinend nicht erzeugt, sondern nur kopiert (Instanzenzähler bleibt auf 1).<br />
Kurz gesagt: Wie erzeuge ich eine große Anzahl Instanzen richtig und kann dann noch weitere hinzufügen und entfernen?</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;

int AnzAutos = 0;

int main()
{
	class Auto
	{
		public:
			int Geschwindigkeit;

			Auto()
			{
				AnzAutos++;
				Geschwindigkeit = 200;
			}
	};

	Auto Auto1;

	std::vector&lt;Auto&gt; Autosammlung;

	for(int i = 0; i &lt; 100; i++)
	{
		Autosammlung.push_back(Auto1);
	}

	std::cout &lt;&lt; &quot;AnzAutos = &quot; &lt;&lt; AnzAutos; // = 1
	std::cout &lt;&lt; &quot;\nAutosammlung[87].Geschwindigkeit = &quot; &lt;&lt; Autosammlung[87].Geschwindigkeit; // = 200

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2455588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455588</guid><dc:creator><![CDATA[Kinemeier]]></dc:creator><pubDate>Tue, 02 Jun 2015 21:04:39 GMT</pubDate></item><item><title><![CDATA[Reply to viele Instanzen erzeugen on Tue, 02 Jun 2015 21:17:40 GMT]]></title><description><![CDATA[<p>Oh, Du hast zwar nur eine Instanz direkt erstellt, die aber im Vektor vervielfältigt, so dass Du nun ganz viele Instanzen hast:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;

int AnzAutos = 0;

int main()
{
    class Auto
    {
        public:
            int Geschwindigkeit;

            Auto()
            {
                AnzAutos++;
                Geschwindigkeit = 200;
            }
    };

    Auto Auto1;

    std::vector&lt;Auto&gt; Autosammlung;

    for(int i = 0; i &lt; 100; i++)
    {
        Autosammlung.push_back(Auto1);
    }

    std::cout &lt;&lt; &quot;AnzAutos = &quot; &lt;&lt; AnzAutos; // = 1
    std::cout &lt;&lt; &quot;\nAutosammlung[87].Geschwindigkeit = &quot; &lt;&lt; Autosammlung[87].Geschwindigkeit; // = 200

//Sieh hier:
   std::cout &lt;&lt; &quot;\nAnzahl: &quot; &lt;&lt; Autosammlung.size() &lt;&lt; '\n';
   for(int i = 0; i &lt; Autosammlung.size(); ++i)
      Autosammlung[i].Geschwindigkeit = i;

   std::cout &lt;&lt; &quot;\nAuto 5 Geschwindigkeit: &quot; &lt;&lt; Autosammlung[5].Geschwindigkeit &lt;&lt; '\n';
   std::cout &lt;&lt; &quot;\nAuto 87 Geschwindigkeit: &quot; &lt;&lt; Autosammlung[87].Geschwindigkeit &lt;&lt; '\n';

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2455591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455591</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Tue, 02 Jun 2015 21:17:40 GMT</pubDate></item><item><title><![CDATA[Reply to viele Instanzen erzeugen on Tue, 02 Jun 2015 21:28:09 GMT]]></title><description><![CDATA[<p>Wenn du wirklich willst, dass der Konstruktor für jedes Auto das du hinzufügst neu aufgerufen wird musst du die Autos so hinzufügen:</p>
<pre><code>for(int i = 0; i &lt; 100; i++)
    {
        Autosammlung.push_back(Auto());
    }
</code></pre>
<p>Dann wird AnzAutos auch deiner Anzahl hinzugefüger Autos entsprechen. Allerdings ist das wenig sinnvoll sich so die Anzahl der Autos zu merken (wenn der überhaupt Ziel ist). Der std::vector speichert sich die Anzahl der hinzugefügten Objekte schon selbst.</p>
<p>Kinemeier schrieb:</p>
<blockquote>
<p>aber da Autos auch jederzeit wieder entfernt bzw. neue hinzugefügt werden müssen, habe ich einen std::vector genommen.</p>
</blockquote>
<p>Das entfernen von Autos ist mit std::vector in etwa genauso umständlich wie bei Arrays. Zumindest wenn du mitten drin Autos entfernen willst weil du dann alle Autos die noch folgen umkopieren musst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2455592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455592</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Tue, 02 Jun 2015 21:28:09 GMT</pubDate></item><item><title><![CDATA[Reply to viele Instanzen erzeugen on Tue, 02 Jun 2015 21:33:58 GMT]]></title><description><![CDATA[<p>sebi707 schrieb:</p>
<blockquote>
<p>Das entfernen von Autos ist mit std::vector in etwa genauso umständlich wie bei Arrays. Zumindest wenn du mitten drin Autos entfernen willst weil du dann alle Autos die noch folgen umkopieren musst.</p>
</blockquote>
<p>Anscheinend ist hier die Reihenfolge nicht wichtig, daher kommt man auch mit einer einzelnen Verschiebung aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2455593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455593</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 02 Jun 2015 21:33:58 GMT</pubDate></item><item><title><![CDATA[Reply to viele Instanzen erzeugen on Tue, 02 Jun 2015 22:09:41 GMT]]></title><description><![CDATA[<p>Was Du u.U. noch nicht weißt: es gibt neben dem Konstruktor, den Du implementiert hast noch weitere.<br />
Dein Konstruktor - der ohne Argumente wird <em>default-constructor</em> genannt.</p>
<p><code>push_back()</code> in Deinem Code fügt allerdings eine Kopie von <code>auto1</code> an den <code>vector</code> an. Um die Kopie zu erstellen benutzt es den <em>copy-constructor</em>.<br />
Da Du keinen copy-c'tor geschrieben hast, wird einer vom Compiler generiert. Der sieht ungefähr so aus:</p>
<pre><code class="language-cpp">class Auto
    {
        .... wie zuvor
            Auto(const Auto&amp; other)  // copy-ctor
            {
                Geschwindigkeit = other.Geschwindigkeit;
            }
    };
</code></pre>
<p>Wie Du siehst: da wird <code>anzAutos</code> nicht inkrementiert. Klar, eigentlich - der Compiler kann ja nicht Deine Gedanken lesen! (Aber er kann doof jedes member kopieren...)</p>
<p>Spendier <code>Auto</code> eine Kopierkonstruktor, der <code>anzautos</code> inkrementiert: et voilà.</p>
<p>&quot;Et voilà&quot; with a twist: Du wirst feststellen, dass <code>AnzAuto</code> enorm groß wird - im Gegensatz zur Größe des Vektors.</p>
<p>Das liegt daran, dass im Hintergrund fröhlich Autos hin und her kopiert werden, wenn der Vektor sich vergrößert, weil er mehr Speicherplatz braucht.<br />
In diesem Moment alloziert der vector neuen (und größeren) Speicherplatz, kopiert jedes Element an seinen neuen Platz und löscht schließlich die alten Elemente. Dafür wird deren <em>destructor</em> aufgerufen.<br />
Dementsprechend musst Du <code>AnzAutos</code> noch im <em>destructor</em> von Auto um 1 verringern.</p>
<p>Viel zu lernen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Es lohnt sich!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2455597</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455597</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Tue, 02 Jun 2015 22:09:41 GMT</pubDate></item><item><title><![CDATA[Reply to viele Instanzen erzeugen on Wed, 03 Jun 2015 06:22:34 GMT]]></title><description><![CDATA[<p>Du kannst auch übrigens einfach Autosammlung.size() nehmen um die Anzahl der Autos innerhalb des vectors zu erfragen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2455608</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455608</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 03 Jun 2015 06:22:34 GMT</pubDate></item><item><title><![CDATA[Reply to viele Instanzen erzeugen on Wed, 03 Jun 2015 08:44:54 GMT]]></title><description><![CDATA[<p>Danke für Eure zahlreichen Antworten.</p>
<p>sebi707 schrieb:</p>
<blockquote>
<pre><code>for(int i = 0; i &lt; 100; i++)
    {
        Autosammlung.push_back(Auto());
    }
</code></pre>
</blockquote>
<p>Genau so habe ich mir das vorgestellt.</p>
<p>Ziel der ganzen Sache ist es, dass ich erst einmal x Instanzen anlege,<br />
geänderte Werte (Lackierung, Kilometerzähler etc.) aus einer Datei einlese,<br />
dann während des Spiels Autos entferne, hinzufüge und verändere und am Ende alles wieder abspeichere.<br />
Das sollte ich nun hinbekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2455622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455622</guid><dc:creator><![CDATA[Kinemeier]]></dc:creator><pubDate>Wed, 03 Jun 2015 08:44:54 GMT</pubDate></item><item><title><![CDATA[Reply to viele Instanzen erzeugen on Wed, 03 Jun 2015 08:55:50 GMT]]></title><description><![CDATA[<p>Man könnte statt dessen auch einfach.</p>
<pre><code>std::vector&lt;Auto&gt; Autosammlung(100);
</code></pre>
<p>schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2455624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455624</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 03 Jun 2015 08:55:50 GMT</pubDate></item><item><title><![CDATA[Reply to viele Instanzen erzeugen on Wed, 03 Jun 2015 12:10:19 GMT]]></title><description><![CDATA[<p>Oh ja, das läuft sogar noch viel schneller.<br />
(Habe allerdings alle Compileroptimierungen deaktiviert.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2455636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455636</guid><dc:creator><![CDATA[Kinemeier]]></dc:creator><pubDate>Wed, 03 Jun 2015 12:10:19 GMT</pubDate></item><item><title><![CDATA[Reply to viele Instanzen erzeugen on Wed, 03 Jun 2015 13:11:01 GMT]]></title><description><![CDATA[<pre><code>std::vector&lt;Auto&gt; autosammlung;
autosammlung.reserve(100);
for(std::size_t i = 0; i &lt; 100; i++)
{
    autosammlung.push_back(Auto());
}
</code></pre>
<p>Dürfte ähnlich schnell laufen und so kannst du sogar unterschiedliche Autos im vector haben, falls du mal einen anderen Konstruktor hinzufügst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2455643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455643</guid><dc:creator><![CDATA[patrick246]]></dc:creator><pubDate>Wed, 03 Jun 2015 13:11:01 GMT</pubDate></item><item><title><![CDATA[Reply to viele Instanzen erzeugen on Wed, 03 Jun 2015 16:05:39 GMT]]></title><description><![CDATA[<p>Kinemeier schrieb:</p>
<blockquote>
<p>Oh ja, das läuft sogar noch viel schneller.<br />
(Habe allerdings alle Compileroptimierungen deaktiviert.)</p>
</blockquote>
<p>Stoppst du mit einem extra Programm die Zeit oder hast du mit mehreren Elementen Millionen Elementen gestestet? Bei 100 Elementen dürfte selbst mit Optimierungen deaktiviert das Programm sofort fertig sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2455655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455655</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Wed, 03 Jun 2015 16:05:39 GMT</pubDate></item><item><title><![CDATA[Reply to viele Instanzen erzeugen on Wed, 03 Jun 2015 16:27:55 GMT]]></title><description><![CDATA[<p>Ja, habe es mit 100 Millionen getestet.<br />
Die Zeiten schwanken zwar enorm, aber das Ergebnis ist trotzdem eindeutig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2455659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455659</guid><dc:creator><![CDATA[Kinemeier]]></dc:creator><pubDate>Wed, 03 Jun 2015 16:27:55 GMT</pubDate></item><item><title><![CDATA[Reply to viele Instanzen erzeugen on Wed, 03 Jun 2015 18:13:58 GMT]]></title><description><![CDATA[<p>Niemanden interessiert, wie schnell unoptimierter Code läuft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2455671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2455671</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 03 Jun 2015 18:13:58 GMT</pubDate></item></channel></rss>