<?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[Konstruktor eigener Klasse und std::vector Initialisierung - Verständnisproblem]]></title><description><![CDATA[<p>Hallo :),</p>
<p>entschuldigt den womöglich etwas seltsam anmutenden Threadtitel, aber mir fiel keine bessere Kurzbeschreibung zu folgender Sache ein. Ich poste erstmal den zu meinem Verständisproblem dazugehörigen (und für diesen Beitrag auf die wichtigsten Elemente gekürzten) Code.</p>
<p>Hier die Klasse:</p>
<pre><code class="language-cpp">// lokalitaet.h
class Lokalitaet {
public:
	// Konstruktor
	Lokalitaet(const std::string &amp;l_name = &quot;Neue Lokalitaet&quot;,
			   const std::string &amp;l_beschr = &quot;Leer&quot;):
			   lok_name(l_name), lok_beschreibung(l_beschr)
			   { lok_id = lok_nummer++; }
    // Operatoren
	friend std::ostream&amp; operator&lt;&lt;(std::ostream &amp;os, const Lokalitaet &amp;lok);
    // Getter, Setter, etc.
private:
	std::string lok_name;
	std::string lok_beschreibung;
	size_t lok_id;
	static size_t lok_nummer;
};
</code></pre>
<p>Und die entsprechenden Definitionen:</p>
<pre><code class="language-cpp">// lokalitaet.cpp
#include &quot;lokalitaet.h&quot;

// Staticelement
size_t Lokalitaet::lok_nummer = 0;

// Operatoren
std::ostream&amp; operator&lt;&lt;(std::ostream &amp;os, const Lokalitaet &amp;lok)
{
	os &lt;&lt; lok.lok_name &lt;&lt; &quot;(&quot; &lt;&lt; lok.lok_id &lt;&lt; &quot;): &quot; &lt;&lt; lok.lok_beschreibung;
	return os;
}
</code></pre>
<p>Wie man sieht soll der Konstruktorrumpf dafür sorgen, dass jedes &quot;Lokalitaet&quot;-Objekt seine eigene ID erhält. Wenn ich jetzt in die <code>main()</code> folgendes schreibe, klappt das auch wunderbar.</p>
<pre><code class="language-cpp">//main.cpp
#include &quot;lokalitaet.h&quot;
/* weitere #include-Befehle, sowie using-Deklarationen */
int main()
{
    vector&lt;Lokalitaet&gt; orte;
	orte.push_back(Lokalitaet(&quot;Test1&quot;, &quot;abc&quot;));
	orte.push_back(Lokalitaet(&quot;Test2&quot;, &quot;xyz&quot;));
    // Ausgabe aller Vectorelemente
	for(vector&lt;Lokalitaet&gt;::const_iterator it = orte.begin(); it != orte.end(); ++it)
		cout &lt;&lt; *it &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Wenn ich das ganze kompiliere erscheint auch die von mir erwartete Ausgabe (man beachte die verschiedenen ID's die in Klammern stehen).</p>
<pre><code>Test1(0): abc
Test2(1): xyz
</code></pre>
<p>Nachdem das erstmal alles geklärt ist kommt hier nun die Sache, die ich nicht so ganz verstehe, denn wenn die <code>main()</code> folgendermaßen aussieht:</p>
<pre><code class="language-cpp">//main.cpp
#include &quot;lokalitaet.h&quot;
/* weitere #include-Befehle, sowie using-Deklarationen */
int main()
{
	vector&lt;Lokalitaet&gt; orte(5, Lokalitaet(&quot;Test&quot;, &quot;abc&quot;));
    // Ausgabe aller Vectorelemente
	for(vector&lt;Lokalitaet&gt;::const_iterator it = orte.begin(); it != orte.end(); ++it)
		cout &lt;&lt; *it &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Dann erscheint die für mich nicht nachvollziehbare folgende Ausgabe:</p>
<pre><code>Test(0): abc
Test(0): abc
Test(0): abc
Test(0): abc
Test(0): abc
</code></pre>
<p>Jedes Vectorelement hat für mich unverständlicherweise die selbe ID (nämlich die Zahl die in Klammern steht, also die 0). Ich hoffe jemand könnte mir bitte erklären wieso beim anlegen eines nicht leeren Vectors der Konstruktor meiner Klasse offenbar nur einmal aufgerufen wird. Vielen Dank schonmal im voraus dafür und auch vielen Dank für das lesen meines doch etwas länger geratenen Beitrages :).</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/233677/konstruktor-eigener-klasse-und-std-vector-initialisierung-verständnisproblem</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 21:04:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/233677.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 07 Feb 2009 15:21:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstruktor eigener Klasse und std::vector Initialisierung - Verständnisproblem on Sat, 07 Feb 2009 15:21:29 GMT]]></title><description><![CDATA[<p>Hallo :),</p>
<p>entschuldigt den womöglich etwas seltsam anmutenden Threadtitel, aber mir fiel keine bessere Kurzbeschreibung zu folgender Sache ein. Ich poste erstmal den zu meinem Verständisproblem dazugehörigen (und für diesen Beitrag auf die wichtigsten Elemente gekürzten) Code.</p>
<p>Hier die Klasse:</p>
<pre><code class="language-cpp">// lokalitaet.h
class Lokalitaet {
public:
	// Konstruktor
	Lokalitaet(const std::string &amp;l_name = &quot;Neue Lokalitaet&quot;,
			   const std::string &amp;l_beschr = &quot;Leer&quot;):
			   lok_name(l_name), lok_beschreibung(l_beschr)
			   { lok_id = lok_nummer++; }
    // Operatoren
	friend std::ostream&amp; operator&lt;&lt;(std::ostream &amp;os, const Lokalitaet &amp;lok);
    // Getter, Setter, etc.
private:
	std::string lok_name;
	std::string lok_beschreibung;
	size_t lok_id;
	static size_t lok_nummer;
};
</code></pre>
<p>Und die entsprechenden Definitionen:</p>
<pre><code class="language-cpp">// lokalitaet.cpp
#include &quot;lokalitaet.h&quot;

// Staticelement
size_t Lokalitaet::lok_nummer = 0;

// Operatoren
std::ostream&amp; operator&lt;&lt;(std::ostream &amp;os, const Lokalitaet &amp;lok)
{
	os &lt;&lt; lok.lok_name &lt;&lt; &quot;(&quot; &lt;&lt; lok.lok_id &lt;&lt; &quot;): &quot; &lt;&lt; lok.lok_beschreibung;
	return os;
}
</code></pre>
<p>Wie man sieht soll der Konstruktorrumpf dafür sorgen, dass jedes &quot;Lokalitaet&quot;-Objekt seine eigene ID erhält. Wenn ich jetzt in die <code>main()</code> folgendes schreibe, klappt das auch wunderbar.</p>
<pre><code class="language-cpp">//main.cpp
#include &quot;lokalitaet.h&quot;
/* weitere #include-Befehle, sowie using-Deklarationen */
int main()
{
    vector&lt;Lokalitaet&gt; orte;
	orte.push_back(Lokalitaet(&quot;Test1&quot;, &quot;abc&quot;));
	orte.push_back(Lokalitaet(&quot;Test2&quot;, &quot;xyz&quot;));
    // Ausgabe aller Vectorelemente
	for(vector&lt;Lokalitaet&gt;::const_iterator it = orte.begin(); it != orte.end(); ++it)
		cout &lt;&lt; *it &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Wenn ich das ganze kompiliere erscheint auch die von mir erwartete Ausgabe (man beachte die verschiedenen ID's die in Klammern stehen).</p>
<pre><code>Test1(0): abc
Test2(1): xyz
</code></pre>
<p>Nachdem das erstmal alles geklärt ist kommt hier nun die Sache, die ich nicht so ganz verstehe, denn wenn die <code>main()</code> folgendermaßen aussieht:</p>
<pre><code class="language-cpp">//main.cpp
#include &quot;lokalitaet.h&quot;
/* weitere #include-Befehle, sowie using-Deklarationen */
int main()
{
	vector&lt;Lokalitaet&gt; orte(5, Lokalitaet(&quot;Test&quot;, &quot;abc&quot;));
    // Ausgabe aller Vectorelemente
	for(vector&lt;Lokalitaet&gt;::const_iterator it = orte.begin(); it != orte.end(); ++it)
		cout &lt;&lt; *it &lt;&lt; endl;

	return 0;
}
</code></pre>
<p>Dann erscheint die für mich nicht nachvollziehbare folgende Ausgabe:</p>
<pre><code>Test(0): abc
Test(0): abc
Test(0): abc
Test(0): abc
Test(0): abc
</code></pre>
<p>Jedes Vectorelement hat für mich unverständlicherweise die selbe ID (nämlich die Zahl die in Klammern steht, also die 0). Ich hoffe jemand könnte mir bitte erklären wieso beim anlegen eines nicht leeren Vectors der Konstruktor meiner Klasse offenbar nur einmal aufgerufen wird. Vielen Dank schonmal im voraus dafür und auch vielen Dank für das lesen meines doch etwas länger geratenen Beitrages :).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1659562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1659562</guid><dc:creator><![CDATA[Mizar]]></dc:creator><pubDate>Sat, 07 Feb 2009 15:21:29 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor eigener Klasse und std::vector Initialisierung - Verständnisproblem on Sat, 07 Feb 2009 15:31:13 GMT]]></title><description><![CDATA[<p>Also die Referenz erklärt dir das Problem meines Erachtens:<br />
<a href="http://www.cplusplus.com/reference/stl/vector/vector.html" rel="nofollow">http://www.cplusplus.com/reference/stl/vector/vector.html</a></p>
<p>und dann das hier:</p>
<blockquote>
<p>explicit vector ( size_type n, const T&amp; value= T(), const Allocator&amp; = Allocator() );<br />
Repetitive sequence constructor: Initializes the vector with its content set to a repetition, n times, of copies of value.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1659564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1659564</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Sat, 07 Feb 2009 15:31:13 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor eigener Klasse und std::vector Initialisierung - Verständnisproblem on Sat, 07 Feb 2009 15:36:13 GMT]]></title><description><![CDATA[<p>Achso, also wird praktisch in meinem Fall ein &quot;Lokalitaet&quot;-Objekt erstellt und dieses dann n-mal kopiert. Ok, damit habe ich wieder was dazugelernt. Vielen Dank Firefighter :).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1659567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1659567</guid><dc:creator><![CDATA[Mizar]]></dc:creator><pubDate>Sat, 07 Feb 2009 15:36:13 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor eigener Klasse und std::vector Initialisierung - Verständnisproblem on Sat, 07 Feb 2009 16:28:51 GMT]]></title><description><![CDATA[<p>Genau das ist das Problem. Ich sitze jetzt auch schon ne Weile um das kopieren zu umgehen, aber ich weiß selber nicht wie und ob es überhaupt möglich ist, dein gewünschtes Verhalten trotz der Verwendung des Ctors wie du ihn gepostet hast in der Main. Vielleicht weiß da jemand anderes Rat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1659600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1659600</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Sat, 07 Feb 2009 16:28:51 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor eigener Klasse und std::vector Initialisierung - Verständnisproblem on Sat, 07 Feb 2009 17:35:48 GMT]]></title><description><![CDATA[<p>Auch wenn es ich es nicht ganz so schön finde werde ich wohl erstmal die &quot;Lokalitaet&quot;-Objekte mittels <code>push_back</code> zum Vector hinzufügen, was jetzt auch nicht so schlimm ist, dennoch wäre auch ich an einer möglichen anderen Lösung interessiert :).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1659622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1659622</guid><dc:creator><![CDATA[Mizar]]></dc:creator><pubDate>Sat, 07 Feb 2009 17:35:48 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor eigener Klasse und std::vector Initialisierung - Verständnisproblem on Sun, 08 Feb 2009 11:05:53 GMT]]></title><description><![CDATA[<p>Du könntest den Kopierkonstruktor so überladen, dass auch Aufrufe von ihm in einer Erhöhung des Zählers resultieren.</p>
<pre><code class="language-cpp">Lokalitaet::Lokalitaet(const Lokalitaet&amp; Origin)
: lok_name(Origin.lok_name)
, lok_beschreibung(Origin.lok_beschreibung)
, lok_id(lok_nummer++)
{

}
</code></pre>
<p>Du musst dir allerdings auch überlegen, was du bei Zuweisungen machst. Entweder du verbietest sie ganz, was aber die Verwendung in Containern erschweren kann, oder du erhöhst auch dann die ID. Da innerhalb von Containern oft Kopien erzeugt werden können, ist die ID nicht mehr wirklich repräsentativ. Temporäre Objekte erhöhen den Counter ja ebenfalls. Darum kann es gut vorkommen, dass z.B. nach einer Reallokation von <code>std::vector</code> plötzlich zehn Nummern übersprungen werden.</p>
<p>Eine relativ einfache Möglichkeit, eindeutige IDs zu bewahren, stellen Smart Pointer dar. <code>boost::shared_ptr</code> oder <code>std::tr1::shared_ptr</code> (identisch) kann in Containern verwendet werden und stellt sicher, dass bei Kopien kein neues Objekt entsteht. Siehe dazu auch <a href="http://magazin.c-plusplus.net/artikel/Schlaue%20Zeiger%20-%20Boost%20Smart%20Pointer" rel="nofollow">diesen Artikel</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1659875</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1659875</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 08 Feb 2009 11:05:53 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor eigener Klasse und std::vector Initialisierung - Verständnisproblem on Sun, 08 Feb 2009 12:33:17 GMT]]></title><description><![CDATA[<p>An Smart Pointer hatte ich noch gar nicht gedacht und das obwohl ich dazu bereits einiges im &quot;C++ Primer&quot; erfahren hatte. Es wird wohl mal Zeit mich intensiver damit auseinanderzusetzen. Vielen Dank Nexus für die Hilfestellung :).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1659918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1659918</guid><dc:creator><![CDATA[Mizar]]></dc:creator><pubDate>Sun, 08 Feb 2009 12:33:17 GMT</pubDate></item></channel></rss>