<?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[&amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich benutze etwa folgenden Code um ein vector&lt;template&gt; objekt zu erzeugen:<br />
[c++]<br />
#include &lt;vector&gt;</p>
<p>using namespace std;</p>
<p>vector&lt;templ&gt; * _liste = new vector&lt;templ&gt;(50);<br />
[/c++]</p>
<p>Wenn ich mir _liste nun anschaue, fällt mir auf, dass der Konstruktor von templ nur einmal aufgerufen wurde und dann nur noch kopiert wurde.</p>
<p>Was muss ich schreiben, damit der Konstruktor für jedes Element (0-49) den Konstruktor für templ aufruft?</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274633/lt-vector-gt-soll-für-jedes-element-den-konstruktor-aufrufen-aber-wie</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 07:55:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274633.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 29 Sep 2010 17:45:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Wed, 29 Sep 2010 17:45:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich benutze etwa folgenden Code um ein vector&lt;template&gt; objekt zu erzeugen:<br />
[c++]<br />
#include &lt;vector&gt;</p>
<p>using namespace std;</p>
<p>vector&lt;templ&gt; * _liste = new vector&lt;templ&gt;(50);<br />
[/c++]</p>
<p>Wenn ich mir _liste nun anschaue, fällt mir auf, dass der Konstruktor von templ nur einmal aufgerufen wurde und dann nur noch kopiert wurde.</p>
<p>Was muss ich schreiben, damit der Konstruktor für jedes Element (0-49) den Konstruktor für templ aufruft?</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959159</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Wed, 29 Sep 2010 17:45:48 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Wed, 29 Sep 2010 17:52:59 GMT]]></title><description><![CDATA[<p>1. (hat zwar nix damit zu tun, aber trotzdem unschön:) wieso nutzt du nicht einfach den stack? (also <code>vector&lt;templ&gt; vec(50);</code> )</p>
<p>2. wieso willst du, dass der ctor aufgerufen wird? es gibt keine ctor-überladung, die n-mal den ctor aufruft.</p>
<p>müsstest also nen leeren vector erzeugen und 50x push_back mit <code>templ()</code> als paramter nutzen.<br />
alle anderen ctors rufen nur den copy-ctor auf.<br />
da das objekt aber so und so kopierbar sein muss, spricht doch auch nichts gegen ein kopieren anstatt des konstruierens!?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959163</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 29 Sep 2010 17:52:59 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Wed, 29 Sep 2010 17:54:20 GMT]]></title><description><![CDATA[<p>Für jedes Element wird auch ein Konstruktor aufgerufen. Das wird aber eben der Kopier-Konstruktor sein. Wenn das bei Dir einen Unterschied macht, hast Du wahrscheinlich eher beim Design der Klasse einen Fehler gemacht.</p>
<p>Scarabol schrieb:</p>
<blockquote>
<pre><code class="language-cpp">vector&lt;templ&gt; * _liste = new vector&lt;templ&gt;(50);
</code></pre>
</blockquote>
<p>Komisches Beispiel. Warum Zeiger/new?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959164</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 29 Sep 2010 17:54:20 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Wed, 29 Sep 2010 18:01:19 GMT]]></title><description><![CDATA[<p>öhm also im Standard Konstruktor meiner Klasse wird eine objekt vom Typ list&lt;templ2&gt; erzeugt, dass aber nach der oben beschriebenen Methode für alle Elemente von _liste gleich ist, aber nicht gleich sein sollte.</p>
<p>Bsp:</p>
<pre><code class="language-cpp">objektliste = new list&lt;objekt&gt;;
</code></pre>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959171</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Wed, 29 Sep 2010 18:01:19 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Wed, 29 Sep 2010 18:02:22 GMT]]></title><description><![CDATA[<p>...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959176</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 29 Sep 2010 18:02:22 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Wed, 29 Sep 2010 18:03:52 GMT]]></title><description><![CDATA[<p>Dann hab ich 0 Elemente im vektor..., wenn ich [] Klammern benutze.</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959181</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Wed, 29 Sep 2010 18:03:52 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Wed, 29 Sep 2010 18:05:54 GMT]]></title><description><![CDATA[<p>Ja, hab schneller geschrieben als gedacht ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959182</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 29 Sep 2010 18:05:54 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Wed, 29 Sep 2010 18:12:13 GMT]]></title><description><![CDATA[<p>Scarabol schrieb:</p>
<blockquote>
<pre><code class="language-cpp">#include &lt;vector&gt;

using namespace std;

vector&lt;templ&gt; * _liste = new vector&lt;templ&gt;(50);
</code></pre>
</blockquote>
<p>Dieser Code ist ziemlich sinnlos. Entweder C Array oder std::vector</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959189</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Wed, 29 Sep 2010 18:12:13 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Wed, 29 Sep 2010 18:18:34 GMT]]></title><description><![CDATA[<p>vll zeigst du mal deine klasse, die du als template-argument(immer templ genannt) verwendest. zumindest die deklaration, wenn die implementierung zu groß ist.</p>
<p>ich vermute das problem aber auch an einer anderen stelle.</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959197</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 29 Sep 2010 18:18:34 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Wed, 29 Sep 2010 18:27:13 GMT]]></title><description><![CDATA[<p>Scarabol schrieb:</p>
<blockquote>
<p>öhm also im Standard Konstruktor meiner Klasse wird eine objekt vom Typ list&lt;templ2&gt; erzeugt, dass aber nach der oben beschriebenen Methode für alle Elemente von _liste gleich ist, aber nicht gleich sein sollte.</p>
<p>Bsp:</p>
<pre><code class="language-cpp">objektliste = new list&lt;objekt&gt;;
</code></pre>
</blockquote>
<p>Sag' ich doch. Klasse falsch entworfen. Das mit dem new gewöhnste Dir mal ganz schnell ab.</p>
<p>Es kann doch so einfach sein:</p>
<pre><code class="language-cpp">class object
{
public:
  int blah;
  explicit object(int j=0) : blah(j) {}
};

class dings
{
  list&lt;object&gt; objliste;
public:
  void hau_rein(object const&amp; o);
};

void dings::hau_rein(object const&amp; o)
{
  objliste.push_back(o);
}

int main()
{
  vector&lt;dings&gt; vec (50);
  vec[12].hau_rein(object(1729));
}
</code></pre>
<p>Wenn Du nicht willst, dass mehrere Objekte einer Klasse Zeiger besitzen, die auf das gleiche Zeigen, dann definiere Dir Deinen eigenen Kopierkonstruktor und Zuweisungsoperator oder &quot;schalte sie ab&quot;, indem Du sie als privat deklarierst (und gar nicht erst definierst).</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959202</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 29 Sep 2010 18:27:13 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Wed, 29 Sep 2010 18:35:37 GMT]]></title><description><![CDATA[<p>Wenn du tatsächlich Heap-Allokation für den Member brauchst, wirst du den Kopierkonstruktor so umstricken müssen, dass er eine Tiefenkopie macht. Ich habe aber die Vermutung, dass du statt</p>
<pre><code class="language-cpp">class templ {
public:
  templ() : objektliste(new std::list&lt;objekt&gt;()) { }

private:
  std::list&lt;objekt&gt; *objektliste;
};
</code></pre>
<p>schlicht</p>
<pre><code class="language-cpp">class templ {
public:
  // ...

private:
  std::list&lt;objekt&gt; objektliste;
};
</code></pre>
<p>schreiben solltest.</p>
<p>Der Grund, warum std::vector Kopien macht, ist übrigens, dass std::vectors betreffender Konstruktor so aussieht:</p>
<pre><code class="language-cpp">explicit vector(size_type n, const T&amp; value = T(), const Allocator&amp; = Allocator());
</code></pre>
<p>...also</p>
<pre><code class="language-cpp">std::vector&lt;templ&gt; liste(50); // _liste ist ein reservierter Bezeichner!
</code></pre>
<p>das selbe bedeutet wie</p>
<pre><code class="language-cpp">std::vector&lt;templ&gt; liste(50, templ(), std::allocator&lt;templ&gt;());
</code></pre>
<p>und dementsprechend beim Aufruf ein temporäres Objekt erzeugt wird, das dann in alle Steckplätze des Vektors kopiert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959210</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Wed, 29 Sep 2010 18:35:37 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Wed, 29 Sep 2010 20:09:34 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wenn ich:</p>
<pre><code>class templ {
public:
  // ...

private:
  std::list&lt;objekt&gt; objektliste;
};
</code></pre>
<p>schreibe.</p>
<p>Meckert der Compiler:<br />
&quot;Instanz von abstrakter Klasse, bla bla bla...&quot;<br />
Diesen Umstand (abstrakte Klasse) kann ich auch leider nicht beheben, da die Klasse zu der Grafikengine (Irrlicht) gehört, die ich benutze.</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959239</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Wed, 29 Sep 2010 20:09:34 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Wed, 29 Sep 2010 20:22:02 GMT]]></title><description><![CDATA[<p>Na, dann ist <code>objekt</code> abstrakt und dann kannst du davon keine Instanzen erzeugen..</p>
<p>Dann wirst du wohl so etwas hier brauchen:</p>
<pre><code class="language-cpp">class templ {
public:
  // ...

private:
  std::list&lt;objekt*&gt; objektliste;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1959242</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959242</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 29 Sep 2010 20:22:02 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Wed, 29 Sep 2010 20:28:47 GMT]]></title><description><![CDATA[<p>Scarabol schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class templ {
public:
  // ...
private:
  std::list&lt;objekt&gt; objektliste;
};
</code></pre>
<p>schreibe, meckert der Compiler:<br />
&quot;Instanz von abstrakter Klasse, bla bla bla...&quot;</p>
</blockquote>
<p>Das eine hat mit dem anderen nichts zu tun. Uns ging es um die Liste als <em>echtes</em> Datenelement Deiner templ-Klasse im Gegensatz zu einem Zeiger auf eine Liste als Datenelement.</p>
<p>Wenn jetzt &quot;objekt&quot; an sich abstrakt ist, funktioniert weder das eine noch das <em>andere</em>:</p>
<pre><code class="language-cpp">class templ {
public:
  // ...
private:
  std::list&lt;objekt&gt;* zeiger_auf_objektliste;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1959244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959244</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 29 Sep 2010 20:28:47 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Wed, 29 Sep 2010 20:42:51 GMT]]></title><description><![CDATA[<p>Also benutze ich drakon's Ansatz?</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959249</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Wed, 29 Sep 2010 20:42:51 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Wed, 29 Sep 2010 20:54:19 GMT]]></title><description><![CDATA[<p>In dem Fall lege ich dir <a href="http://www.boost.org/doc/libs/1_44_0/libs/ptr_container/doc/ptr_container.html" rel="nofollow">Boosts Pointer-Container</a> ans Herz, speziell boost::ptr_list. Alternativ std::list&lt;std::tr1::shared_ptr&lt;objekt&gt; &gt;. Dann musst du dich nicht selbst um die Speicherverwaltung kümmern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959251</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Wed, 29 Sep 2010 20:54:19 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Wed, 29 Sep 2010 22:08:54 GMT]]></title><description><![CDATA[<p>Die Klassen die von der Grafikengine zur Verfügung gestellt werden, sind fast alle abstrakt. Wenn ich jetzt eine dieser Klassen in meiner eigenen verwenden möchte, bleibt mir doch nicht anderes übrig als den Pointer auf den Member &quot;private:&quot; zu deklarieren.<br />
Im Konstruktor meiner Klasse erzeuge ich dann das eigentliche Objekt mit new.</p>
<p>Versteh ich das jetzt richtig?</p>
<p>Edit Frage 2:<br />
Ich habe eine Klasse, die den Pointer auf eine abstrakte Klasse als Member hat.<br />
Wenn ich jetzt den Ctor definieren möchte, sollte der Pointer nicht nur kopiert werden sondern auch das Objekt auf das er evtl. zeigt.<br />
Nur wie stell ich das an?<br />
Wenn ich versuche</p>
<pre><code>myklasse::myklasse(const myklasse&amp; k)
{
_pointer_auf_abstrakt = new abstrakteKlasse(*k._pointer_auf_abstrakt);
}
</code></pre>
<p>Meint der Compiler &quot;Instanz von abstrakter Klasse kann nicht erstellt werden.&quot;</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959260</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Wed, 29 Sep 2010 22:08:54 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Wed, 29 Sep 2010 23:10:21 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21921">@Scarabol</a>:<br />
Wenn du nur einen Zeiger auf eine Basisklasse hast (egal ob abstrakt oder nicht), aber das vollständige Objekt kopieren willst (dessen vollständigen Typ du nicht kennst)...<br />
dann geht das nur, wenn der Entwickler der Basisklasse (und aller abgeleiteten Klassen) extra einen Mechanismus dafür vorgesehen hat.</p>
<p>Der üblichste, mir bekannte solche Mechanismus wäre eine virtuelle Klon-Funktion in der Basisklasse, die dann in jeder abgeleiteten Klasse überschrieben wird.<br />
Die Klon-Funktion gibt dir als Returnwert einen Basisklassen-Zeiger auf das kopierte, vollständige Objekt.</p>
<p>Verwendung ist dann hübsch einfach:</p>
<pre><code class="language-cpp">myklasse::myklasse(const myklasse&amp; k)
{
    _pointer_auf_abstrakt = k._pointer_auf_abstrakt-&gt;Clone();
}
</code></pre>
<p>Nur frage ich mich gerade, wieso du Objekte der Grafikengine kopieren willst/musst.</p>
<p>BTW: wenn es sich um Texturen/Meshes o.ä. handelt, dann kannst du die normalerweise &quot;kopieren&quot; indem du einfach ein neues Objekt über die Factory-Funktion der Engine erzeugst, und dann den Inhalt rüberkopierst.</p>
<p>Quasi (sinngemäss)</p>
<pre><code class="language-cpp">MyTexture::MyTexture(MyTexture const&amp; other)
{
    // neue Textur anlegen
    Size const size = other.m_engineTexture-&gt;GetSize();
    m_engineTexture = other.m_engineTexture-&gt;GetEngine()-&gt;CreateTexture(
        size,
        other.m_engineTexture-&gt;GetPixelFormat());

    // Daten rüberkopieren
    m_engineTexture-&gt;UpdateRect(Rect(Point(0, 0), size), other.m_engineTexture, Point(0, 0));
    // oder wie auch immer man die Pixeldaten von einer Textur in eine andere kopiert
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1959270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959270</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 29 Sep 2010 23:10:21 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Thu, 30 Sep 2010 06:12:06 GMT]]></title><description><![CDATA[<p>Ich MUSS die Daten ja nicht kopieren, aber ein guter Kopierkonstruktor setzt voraus das ich es mache, oder?</p>
<p>Um bspw. die Skybox zu kopieren bzw. nach deiner Methode neu zu erzeugen sind einige Parameter notwendig, genau wie für andere Objekte. Daher müsste ich in fast alle meiner klassen dafür extra private Member zusätzlich definieren (Overhead).</p>
<p>Ich schau mal nach einer Klon Funktion...<br />
Edit:<br />
Die Engine hat tatsächlich für einige abstrakte Objekte eine clone Funktion. Leider kopiert die aber nicht das komplette Objekt sondern nur den Teil der geerbt wurde. Hilft mir also nicht weiter....</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959300</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Thu, 30 Sep 2010 06:12:06 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Thu, 30 Sep 2010 09:44:18 GMT]]></title><description><![CDATA[<p>Scarabol schrieb:</p>
<blockquote>
<p>Ich MUSS die Daten ja nicht kopieren, aber ein guter Kopierkonstruktor setzt voraus das ich es mache, oder?</p>
</blockquote>
<p>Wieso willst du kopieren?<br />
Wieso meinst du dass du einen Copy-Ctor brauchst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959415</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 30 Sep 2010 09:44:18 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Thu, 30 Sep 2010 10:03:26 GMT]]></title><description><![CDATA[<p>Na, weil vector&lt;templ&gt; den Ctor benutzt. Muss ich ihn auch definieren, damit ich korrekte templ Objekte erhalte.</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959428</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Thu, 30 Sep 2010 10:03:26 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Thu, 30 Sep 2010 11:51:45 GMT]]></title><description><![CDATA[<p>Und wieso willst du <code>vector&lt;T&gt;</code> verwenden?<br />
<code>vector&lt;T&gt;</code> ist für teuer zu kopierende <code>T</code> total ungeeignet.</p>
<p>Nimm nen Pointer-Container, oder nen <code>vector&lt;shared_ptr&lt;T&gt;&gt;</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959494</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 30 Sep 2010 11:51:45 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Thu, 30 Sep 2010 13:46:30 GMT]]></title><description><![CDATA[<p>Sorry, aber ich versteh nur noch Bahnhof...</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959579</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Thu, 30 Sep 2010 13:46:30 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Thu, 30 Sep 2010 13:59:27 GMT]]></title><description><![CDATA[<p>Wenn du einen vector auf eine Klasse nimmst statt auf Zeiger auf die Klasse, wird bei jedem Einfügen der copy-ctor der Klasse aufgerufen, was die Zeit des Einfügens ziemlich groß macht. Das muss nicht schlimm sein, darüber musst Du Dir aber bewusst sein.</p>
<p>Wenn Dir das zu teuer ist, solltest Du ptr_vector&lt;T&gt; nehmen (der zerstört deine Objekte am Ende wieder) oder vector&lt;shared_ptr&lt;T&gt;&gt;, wenn Du T noch außerhalb der Klasse nutzt, es aber keine zentrale Instanz gibt, welche verantwortlich für die Zerstörung ist (oder wenn ptr_vector&lt;T&gt; aus irgendeinem Grund nicht unterstützt wird). vector&lt;T*&gt; ist auch in Ordnung, wenn der vector nicht verantwortlich für die Zerstörung sein soll.</p>
<p>hustbaer:<br />
Wieso findest Du das denn so schlimm?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959585</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Thu, 30 Sep 2010 13:59:27 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Thu, 30 Sep 2010 22:25:16 GMT]]></title><description><![CDATA[<p>Naja schlimm...<br />
Ich finde es sinnlos. Ganz speziell in seinem Fall wo es um Texturen geht.</p>
<p>Warum?</p>
<p>Weil es Symptombekämpfung ist.<br />
Weil es schlechter Stil ist, und er sich sowas gar nicht angewöhnen sollte.<br />
Weil er sich damit weitere Probleme schafft, die man vermutlich wieder nur mit unsauberen Hacks lösen kann, was wieder zu Problemen führt uswusf.</p>
<p>Warum ich das alles denke?</p>
<p>Weil für mich Texturen ganz klar eine Identität haben, also &quot;class types&quot; und keine &quot;value types&quot; sind. Und die haben in einem Vektor nunmal nix verloren, da ein Vektor Objekte &quot;by value&quot; kopiert (und das nicht nur beim erstmaligen Einfügen!), und damit ihre Identität vernichtet.</p>
<p>Alle mir bekannten 3D APIs arbeiten mit Referenzen (Zeigern, Smart-Pointern etc.) auf Texturen. Wenn ich eine Textur in einen Texture-Slot stecke, dann stecke ich da den Zeiger rein, die eigentliche Textur (der &quot;Wert&quot;) wird dabei <em>nicht</em> kopiert. Das selbe gilt für Render-Targets.</p>
<p>Wenn sich nun aber die Adresse der Textur ändern kann, dann gibt's Probleme. Die Textur könnte gerade als Render-Target ausgewält sein, oder in einem Texture-Slot stecken. Wenn man dann rendert wird nicht die &quot;neue&quot; Textur bzw. das &quot;neue&quot; Render-Target verwendet, das nach z.b. einer Reallokation im Vektor steckt, sondern die alte, die ursprünglich dem 3D Device übergeben wurde. Das führt dann im Ideallfall zu Grafikfehlern und schlimmstenfalls zu Abstürzen.</p>
<p>Auch wird es dadurch unmöglich, irgendwo Referenzen auf die Textur zu halten. z.B. in irgendwelchen Game-Objekten. Man müsste stattdessen mit irgendwelchen IDs/Indexen/... arbeiten, und sich die Textur jedes mal wenn man sie braucht über diese IDs/... holen. D.h. man bastelt sich die Referenz-Semantik nach, die man gerade vernichtet hat, indem man den falschen Container verwendet hat.</p>
<p>Und das alles nur um <code>std::vector&lt;T&gt;</code> statt <code>boost::ptr_vector&lt;T&gt;</code> oder <code>std::vector&lt;std::tr1::shared_ptr&lt;T&gt;&gt;</code> verwenden zu können.</p>
<p>Und da ich mir keine Vorteile vorstellen kann, die die oben skizzierten Probleme aufwiegen, halte ich das für Murks.</p>
<p>----</p>
<p>Ansonsten, etwas allgemeiner: auch wenn es sich um teuer zu kopierende &quot;value types&quot; handelt halte ich <code>std::vector&lt;T&gt;</code> für unpassend. Und zwar weil jedes eingefügte Objekt im Schnitt 2-3 mal kopiert wird (vorausgesetzt dass man nie Elemente löscht). 1x beim Einfügen selbst, und weitere ~~ 1-2 mal (je nach Vektor-Implementierung) durch das &quot;Umkopieren&quot; wenn der Vektor wächst. Da das beim Fenster hinausgeworfene Rechenzeit ist, halte ich es für schlecht. Vor allem wenn man sich keine Vorteile dadurch erkauft. Und was für Vorteile ein Vektor im Vergleich zu einem Pointer-Vektor bei teuer zu kopierenden Elementen haben könnte, weiss ich nicht. Falls dir einer einfällt, lass es mich wissen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959830</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 30 Sep 2010 22:25:16 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;lt;vector&amp;gt; soll für jedes Element den Konstruktor aufrufen, aber wie? on Thu, 30 Sep 2010 23:48:47 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Nagut, also bei Grafikengines ist es ja nun so, dass hin und wieder auch die Grafikbibliothek das eigentliche Speichern uebernimmt. Deswegen stecke ich meine Textur sehr wohl in eine map, weil die aber auch nur die ID haelt, ueber welche OpenGL angesprochen werden kann.</p>
<p>Gut, sobald Objekte in einen Renderzyklus gelangen oder von mehr als einer Seite via Zeiger angesprochen werden muessen, ist der Zeiger natuerlich klar.</p>
<p>Rein aus Interesse jetzt Mal als Randthema: Wieso koennte vector etwas umschieben, wenn er waechst? Weil er den Speicher sonst nicht mehr zusammenhaengend speichern kann? Eigentlich bin ich bisher davon ausgegangen, dass vector garantiert, dass darauf gerichtete Zeiger gueltig bleiben, egal, wie man vergroessert.</p>
<p>Vorteile bei Nutzung von automatischen Variablen statt Zeigern gibt es ja genug wie automatische Speicherverwaltung, Entlastung des Heaps ([url=&quot;<a href="http://c-plusplus.net/forum/viewtopic-var-t-is-274631.html" rel="nofollow">http://c-plusplus.net/forum/viewtopic-var-t-is-274631.html</a>&quot;]in einem anderen Thread[/url], wo es um etwas Aehnliches ging, zeigte sich der ja auch begrenzt) oder direkter Zugriff auf die Variablen ohne Indirektion, was bei der geringen Anzahl von Zugriffen natuerlich vernachlaessigbar sein sollte.</p>
<p>- Und ja, ich habe gelesen, dass Du geschrieben hast, dass es um Vorteile gibt, welche die Nachteile aufwiegen. Darum stimme ich Dir schon zu, dass hier Pointer mehr Sinn machen, wenn man die Textur tatsaechlich in der Klasse speichert, um die Ladezeiten fuer den Benutzer zu verringern.</p>
<p>Die value type und class type-Begriffe sind sehr praktisch, das werde ich mir Mal im Kopf behalten. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1959854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959854</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Thu, 30 Sep 2010 23:48:47 GMT</pubDate></item></channel></rss>