<?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[kurze frage zu Containern]]></title><description><![CDATA[<p>Ich hab mir jetzt ein Container mit einem eigenen Datentyp angelegt.<br />
aber ich bin mir irgenwie noch garnicht sicher was das angeht, und auch mit der fehlermeldung kann ich recht wenig anfangen.</p>
<pre><code class="language-cpp">typedef list&lt;Partikel&gt; Partikellist;
//..
Partikellist pl();
//...
pl.push_back(new Partikel(mx,my,0,-3));
</code></pre>
<p>fehler des Compilers</p>
<pre><code>newmain.cc:107: Fehler: Abfrage des Elementes »push_back« in »pl«, das vom Nicht-Klassentyp »Partikellist ()()« ist
</code></pre>
<p>und wenn ich die elemente aus der liste wieder lösche, wird der Speicher dann wieder freigegeben?<br />
oder hab ich das völlig falsch angefangen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/185249/kurze-frage-zu-containern</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 03:06:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/185249.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 23 Jun 2007 09:07:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to kurze frage zu Containern on Sat, 23 Jun 2007 09:07:50 GMT]]></title><description><![CDATA[<p>Ich hab mir jetzt ein Container mit einem eigenen Datentyp angelegt.<br />
aber ich bin mir irgenwie noch garnicht sicher was das angeht, und auch mit der fehlermeldung kann ich recht wenig anfangen.</p>
<pre><code class="language-cpp">typedef list&lt;Partikel&gt; Partikellist;
//..
Partikellist pl();
//...
pl.push_back(new Partikel(mx,my,0,-3));
</code></pre>
<p>fehler des Compilers</p>
<pre><code>newmain.cc:107: Fehler: Abfrage des Elementes »push_back« in »pl«, das vom Nicht-Klassentyp »Partikellist ()()« ist
</code></pre>
<p>und wenn ich die elemente aus der liste wieder lösche, wird der Speicher dann wieder freigegeben?<br />
oder hab ich das völlig falsch angefangen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311965</guid><dc:creator><![CDATA[Krux]]></dc:creator><pubDate>Sat, 23 Jun 2007 09:07:50 GMT</pubDate></item><item><title><![CDATA[Reply to kurze frage zu Containern on Sat, 23 Jun 2007 09:15:02 GMT]]></title><description><![CDATA[<p>Das Problem hat überhaupt nichts mit Containern zu tun, sondern mit der Arbeitsweise des Compilers - laut Standard interpretiert der alles als Funktionsdeklaration, was als Funktion durchgehen könnte. Das bedeutet, die Anweisung <code>Partikelliste pl();</code> deklariert eine Funktion, die keine Parameter übernimmt und eine list&lt;...&gt; zurückgibt. Eine default-konstruierte (leere) Liste definierst du mit <code>Partikelliste pl;</code> .</p>
<p>PS: Und Elemente, die du in die Liste einfügen willst, mußt du nicht per new anlegen <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="😉"
    /> (Randfrage: Bist du von Java auf C++ umgestiegen?)</p>
<p>Krux schrieb:</p>
<blockquote>
<p>und wenn ich die elemente aus der liste wieder lösche, wird der Speicher dann wieder freigegeben?<br />
oder hab ich das völlig falsch angefangen?</p>
</blockquote>
<p>Was die Liste angefordert hat, gibt sie auch selber wieder frei - du mußt nur den Speicher zurückgeben, den du selber geholt hat (Merkregel: Zu jedem 'new' gehört <strong>ein</strong> 'delete').</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311969</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 23 Jun 2007 09:15:02 GMT</pubDate></item><item><title><![CDATA[Reply to kurze frage zu Containern on Sat, 23 Jun 2007 09:22:51 GMT]]></title><description><![CDATA[<p>Angefangen hab ich mit C++, da hab ich mich allerdings noch nicht so intensiv mit den dort gegebenen Containern auseinander gesetzt.</p>
<p>Java hab ich dann allerdings an der Uni viel intensiver gelernt, wo ich viel schneller mit den Containern in berührung kahm.</p>
<p>und das zu jedem new ein delete kommt hab ich mir auch gedacht, deshalb kam mit das ja auch so komisch vor, aber wie mache ich das dann ohne new?</p>
<p>danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311974</guid><dc:creator><![CDATA[Krux]]></dc:creator><pubDate>Sat, 23 Jun 2007 09:22:51 GMT</pubDate></item><item><title><![CDATA[Reply to kurze frage zu Containern on Sat, 23 Jun 2007 09:26:12 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">typedef list&lt;Partikel&gt; Partikellist;
//..
Partikellist pl;
//...
pl.push_back(Partikel(mx,my,0,-3));
</code></pre>
<p>new ist in dem Fall nicht nur unpassend, sondern komplett falsch - das liefert einen &quot;Partikel*****&quot;, mit dem dein Container nichts anfangen kann.</p>
<p>(new bräuchtest du nur, wenn du eine list&lt;Partikel*&gt; verwenden würdest - und dann müsstest du dich auch selber darum kümmern, die Listen-Elemente zu delete'n)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311978</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 23 Jun 2007 09:26:12 GMT</pubDate></item><item><title><![CDATA[Reply to kurze frage zu Containern on Sat, 23 Jun 2007 09:28:18 GMT]]></title><description><![CDATA[<p>als java umsteiger muss man sich dran gewöhnen, dass in c++ objekte nicht durch ein new erzeugt werden <strong>müssen</strong>. ein &quot;A a;&quot; wäre in java lediglich eine deklaration, in c++ wird mit dem statement bereits ein objekt vom typ A angelegt und initialisiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311979</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Sat, 23 Jun 2007 09:28:18 GMT</pubDate></item><item><title><![CDATA[Reply to kurze frage zu Containern on Sat, 23 Jun 2007 09:32:41 GMT]]></title><description><![CDATA[<p>ok wäre schön zu wissen, was ich denn dann überhaupt übergebe.<br />
Ist das ein funktionspointer inklusive argumente? (Funktionspointer stehen in meinem buch irgendwie nicht drin)</p>
<p>In Java übergibt man ja die Pointer (auch wenn es offiziel ja keine gibt) an die Container, allerdings kümmert sich dann der Müllsammler (GC) um das freigeben des speicherbereiches. Ich hab mir gedacht, dass das in C++ ja auch hätte so umgesetzt worden sein können, das man die pointer übergibt, aber dann von der klasse deletet werden (wäre ja möglich).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311980</guid><dc:creator><![CDATA[Krux]]></dc:creator><pubDate>Sat, 23 Jun 2007 09:32:41 GMT</pubDate></item><item><title><![CDATA[Reply to kurze frage zu Containern on Sat, 23 Jun 2007 09:33:07 GMT]]></title><description><![CDATA[<p>Krux schrieb:</p>
<blockquote>
<p>ok wäre schön zu wissen, was ich denn dann überhaupt übergebe.<br />
Ist das ein funktionspointer inklusive argumente (Funktionspointer stehen in meinem buch irgendwie nicht drin)</p>
</blockquote>
<p>Nein, das ist ein temporär erzeugtes Objekt. Das ganze ist etwa äquivalent zu <code>Partikel tmp(mx,xy,0,-3);pl.push_back(tmp);</code> nur mit dem Unterschied, daß das Objekt keinen Namen bekommt (das ist aus deiner Sicht egal, erleichtert aber dem Compiler mögliche Optimierungen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311984</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 23 Jun 2007 09:33:07 GMT</pubDate></item><item><title><![CDATA[Reply to kurze frage zu Containern on Sat, 23 Jun 2007 09:41:33 GMT]]></title><description><![CDATA[<p>c++ hat auch so eine art garbage collector. allerdings nur für den stack, nicht für den heap.</p>
<pre><code class="language-cpp">A a; // erzeugt ein objekt auf dem stack
A *a = new A; // erzeugt ein objekt auf dem heap
</code></pre>
<p>objekte auf dem heap werden automatisch freigegeben, wenn ihr gültigkeitsbereich verlassen wird. objekte auf dem heap erst dann, wenn sie explizit mittels delete freigegeben wurden.</p>
<p>d.h. wenn du in eine list stack objekte legst (list&lt;Partikel&gt;) dann werden diese auch automatisch wieder entfernt, wenn die list nicht mehr benötigt wird oder wenn du diese aus der liste entfernst. ausserdem werden die objekte tatsächlich in die interne datenstruktur der list kopiert.</p>
<p>ein list&lt;Partikel*&gt; würde eine list erstellen, die <strong>pointer</strong> auf partikelelemente aufnimmt. diese werden nicht automatisch wieder entfernt, auch wenn die list gelöscht wird. die pointer selbst werden zwar verschwinden, nicht aber das objekt im heap, auf die dieser pointer gezeigt hat.</p>
<pre><code class="language-cpp">list&lt;A&gt; l;
{
 A a;
 l.push_back(a); // a wird in die list kopiert
}
// a ist hier nicht mehr sichtbar, der gültigkeitsbereich wurde verlassen
// a ist somit &quot;zerstört&quot;, allerdings existiert die kopie in der list noch

list&lt;A*&gt; l;
{
 A *a = new A;
 l.push_back(a);
}
// der pointer *a ist nicht mehr sichtbar, das objekt auf dem heap existiert
// allerdings noch und ein gültiger pointer befindet sich in der list

// und jetzt das c++ &quot;problem&quot;
list&lt;A*&gt; l;
{
 A a; // objekt auf dem stack
 l.push_back(&amp;a); // mit &amp;a wird die adresse (&quot;pointer&quot;) des objekts in die list gelegt
}
// hier ist a nicht mehr sichtbar UND zerstört. der pointer in der liste zeigt
// auf bereits wieder freigegebenen speicher und ist somit ungültig.
// bei zugriff auf den pointer fliegt dir das programm um die ohren
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1311989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311989</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Sat, 23 Jun 2007 09:41:33 GMT</pubDate></item><item><title><![CDATA[Reply to kurze frage zu Containern on Sat, 23 Jun 2007 09:48:46 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Krux schrieb:</p>
<blockquote>
<p>ok wäre schön zu wissen, was ich denn dann überhaupt übergebe.<br />
Ist das ein funktionspointer inklusive argumente (Funktionspointer stehen in meinem buch irgendwie nicht drin)</p>
</blockquote>
<p>Nein, das ist ein temporär erzeugtes Objekt. Das ganze ist etwa äquivalent zu <code>Partikel tmp(mx,xy,0,-3);pl.push_back(tmp);</code> nur mit dem Unterschied, daß das Objekt keinen Namen bekommt (das ist aus deiner Sicht egal, erleichtert aber dem Compiler mögliche Optimierungen).</p>
</blockquote>
<pre><code class="language-cpp">Partikellist pl;
{
    Partikel tmp;
    pl.push_back(tmp);
}

pl.//mache irgendwas mit dem letzten objekt von pl
</code></pre>
<p>müsste dann ja auch funktionieren<br />
erzeut der Container dann intern eine Kopie?</p>
<p>Edit:<br />
ok jetzt ist alles klar<br />
pl.push_back(Partikel(1,2,3,4))<br />
erstellt also ein Partikel kopiert ihn und zerstört den zuerst erstellten dann wieder.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311991</guid><dc:creator><![CDATA[Krux]]></dc:creator><pubDate>Sat, 23 Jun 2007 09:48:46 GMT</pubDate></item><item><title><![CDATA[Reply to kurze frage zu Containern on Sat, 23 Jun 2007 09:46:11 GMT]]></title><description><![CDATA[<p>Krux schrieb:</p>
<blockquote>
<p>erzeut der Container dann intern eine Kopie?</p>
</blockquote>
<p>jup</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1311993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1311993</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Sat, 23 Jun 2007 09:46:11 GMT</pubDate></item><item><title><![CDATA[Reply to kurze frage zu Containern on Sat, 23 Jun 2007 19:50:58 GMT]]></title><description><![CDATA[<p>jetzt hab nich noch eine Frage:</p>
<p>ich hab meine Liste an Partikeln, und die wird immer durchiteriert. Jedes Partikel hat eine gewisse lebensdauer, und wenn die Abgelaufen ist, das muss der Partikel weg. genau da ist mein Problm:</p>
<pre><code class="language-cpp">Partikellist::iterator pos;

for (pos = pl.begin(); pos != pl.end(); pos++ ){
    if(pos-&gt;update(dt))
        pos-&gt;draw(kreis);
    else{
        cout &lt;&lt; &quot;Jetzt wird gelöscht&quot; &lt;&lt; endl;
        pl.erase(pos);
    }
}
</code></pre>
<p>jetzt kommt direkt nach der Ausgabe &quot;jetzt wird gelöscht&quot; ein segmentation fault, und das Programm schmiert ab. Wie lösche ich richtig aus einer Liste?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312396</guid><dc:creator><![CDATA[Krux]]></dc:creator><pubDate>Sat, 23 Jun 2007 19:50:58 GMT</pubDate></item><item><title><![CDATA[Reply to kurze frage zu Containern on Sat, 23 Jun 2007 22:19:17 GMT]]></title><description><![CDATA[<p>ein erase in einer liste invalidiert den iterator auf das element, das gelöscht wird. erase gibt aber den iterator auf das nächste element zurück. also einfach:</p>
<pre><code class="language-cpp">pos = li.erase(pos);
</code></pre>
<p>dein code könnte übrigens noch aussagekräftiger sein, wenn du remove_if verwenden würdest:</p>
<pre><code class="language-cpp">struct NotUpdatable
{
  bool operator () (Particle &amp;p) const
  {
    if (p.update())
    {
      p.draw();
      return false
    }
    return true;
  }
};

//...
li.remove_if (NotUpdatable());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1312491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312491</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Sat, 23 Jun 2007 22:19:17 GMT</pubDate></item><item><title><![CDATA[Reply to kurze frage zu Containern on Sat, 23 Jun 2007 22:46:45 GMT]]></title><description><![CDATA[<p>sorry, hatte vergessen zu sagen, dass update ein bool zurückliefert, das sagt, ob das objekt weiter existieren soll. Ist vieleicht nicht optimal, aber ok.<br />
wenn ich jetzt</p>
<pre><code class="language-cpp">pos = li.erase(pos);
</code></pre>
<p>benutze, überspringe ich dann nicht ein Objekt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312500</guid><dc:creator><![CDATA[Krux]]></dc:creator><pubDate>Sat, 23 Jun 2007 22:46:45 GMT</pubDate></item><item><title><![CDATA[Reply to kurze frage zu Containern on Sat, 23 Jun 2007 22:57:51 GMT]]></title><description><![CDATA[<p>ja. nutze besser remove_if, wenn es geht. andernfalls lass pos++ im for-kopf weg und bau es in den if(pos-&gt;update()) zweig ein.<br />
/edit: ps es hat sich eingebürgert, ++pos anstelle von pos++ zu verwenden, was gewisse vorteile bietet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312504</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Sat, 23 Jun 2007 22:57:51 GMT</pubDate></item><item><title><![CDATA[Reply to kurze frage zu Containern on Sat, 23 Jun 2007 23:17:35 GMT]]></title><description><![CDATA[<p>gewisse vorteile? welche denn?</p>
<p>und was ist wenn ich continue einbaue, dann müsster der doch nicht pos++ durchführen oder?</p>
<p>Edit, ich hab mir grad mal continue genauer angeschaut (habs noch nie sinnvoll vverwenden können), und es geht nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312510</guid><dc:creator><![CDATA[Krux]]></dc:creator><pubDate>Sat, 23 Jun 2007 23:17:35 GMT</pubDate></item><item><title><![CDATA[Reply to kurze frage zu Containern on Sun, 24 Jun 2007 00:25:30 GMT]]></title><description><![CDATA[<p>Krux schrieb:</p>
<blockquote>
<p>gewisse vorteile? welche denn?</p>
</blockquote>
<p>ein temporäres objekt weniger, das erzeugt wird. kann geschwindigkeitsvorteile bringen (wenn exzessiv genutzt), schadet auf jedenfall nicht.</p>
<blockquote>
<p>und was ist wenn ich continue einbaue, dann müsster der doch nicht pos++ durchführen oder?</p>
<p>Edit, ich hab mir grad mal continue genauer angeschaut (habs noch nie sinnvoll vverwenden können), und es geht nicht.</p>
</blockquote>
<p><code>continue</code> weist ja nur den nächsten schleifendurchlauf an. aber warum jetzt nicht einfach</p>
<pre><code class="language-cpp">for (list&lt;Particle&gt;::iterator pos = foo.begin(); pos != foo.end(); )
   {
      if (pos-&gt;update())
      {
         pos-&gt;print();
         ++pos;
      }
      else
      {
         pos=foo.erase(pos);
      }
</code></pre>
<p>oder<br />
<code>pos=--foo.erase(pos);</code><br />
oder remove_if (ich lege es dir wirklich ans herz)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312534</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Sun, 24 Jun 2007 00:25:30 GMT</pubDate></item><item><title><![CDATA[Reply to kurze frage zu Containern on Sun, 24 Jun 2007 09:51:59 GMT]]></title><description><![CDATA[<p>queer_boy schrieb:</p>
<blockquote>
<p><code>pos=--foo.erase(pos);</code></p>
</blockquote>
<p>bei einer einfah verketteten liste? Ich denke nicht.</p>
<p>queer_boy schrieb:</p>
<blockquote>
<p>oder remove_if (ich lege es dir wirklich ans herz)</p>
</blockquote>
<p>ja vieleicht, wenn ich es verstehen würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312631</guid><dc:creator><![CDATA[Krux]]></dc:creator><pubDate>Sun, 24 Jun 2007 09:51:59 GMT</pubDate></item><item><title><![CDATA[Reply to kurze frage zu Containern on Sun, 24 Jun 2007 17:31:00 GMT]]></title><description><![CDATA[<p>Krux schrieb:</p>
<blockquote>
<p>queer_boy schrieb:</p>
<blockquote>
<p><code>pos=--foo.erase(pos);</code></p>
</blockquote>
<p>bei einer einfah verketteten liste? Ich denke nicht.</p>
</blockquote>
<p>einfach verkettet? woher hast du das? immerhin verwendet list bidirektionale iteratoren..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1312910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1312910</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Sun, 24 Jun 2007 17:31:00 GMT</pubDate></item></channel></rss>