<?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[Objekt aus Liste löschen (List iterator not incrementable)]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>Ich habe eine Reihe von Objekten in eine Liste geladen:</p>
<pre><code>srand(GetTickCount());
while(k &lt; 5) {					
 Sprite *osMonster = new Sprite;					
 osMonster-&gt;createSpriteFromFile(Direct3D.GetDevice(), &quot;monster.bmp&quot;);		   
 osMonster-&gt;setSpritePosition(rand()%800, rand()%600);
 osMonster_List.push_back(osMonster);
 k++;
}
</code></pre>
<p>Nun möchte ich, wenn ich mit dem Mauszeiger über so ein Objekt (also in dem Fall ein Monster-Sprite) fahre und draufklicke, dieses Objekt aus der Liste löschen.<br />
Dafür habe ich mir folgenden Code überlegt, der jedoch nicht richtig funktioniert:</p>
<pre><code>case WM_LBUTTONDOWN:
[...]
POINT pt; 
GetCursorPos(&amp;pt);
for(it=osMonster_List.begin();it!=osMonster_List.end();it++) {
	if( (pt.x &gt; (*it)-&gt;getSpritePosition().x) &amp;&amp; (pt.x &lt; (*it)-&gt;getSpritePosition().x + SpriteWidth) 
&amp;&amp; (pt.y &gt; (*it)-&gt;getSpritePosition().y) &amp;&amp; (pt.y &lt; (*it)-&gt;getSpritePosition().y + SpriteHeight) ) {
   delete *it;	
   it = osMonster_List.erase(it);				   
   }
}
</code></pre>
<p>Das scheint nur manchma spontan zu funktionieren. Ich kann 2-3 Sprites anklicken , aber dann stürzt mir das Programm mit der Meldung: &quot;List iterator not incrementable&quot; ab :(!</p>
<p>Ich nutze Microsoft Visual Studio 2005 und DirectX9.</p>
<p>Bin für jede Hilfe äußerst dankbar!</p>
<p>Tschau<br />
Sandro</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/192192/objekt-aus-liste-löschen-list-iterator-not-incrementable</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 09:20:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/192192.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 11 Sep 2007 14:54:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekt aus Liste löschen (List iterator not incrementable) on Tue, 11 Sep 2007 14:54:05 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>Ich habe eine Reihe von Objekten in eine Liste geladen:</p>
<pre><code>srand(GetTickCount());
while(k &lt; 5) {					
 Sprite *osMonster = new Sprite;					
 osMonster-&gt;createSpriteFromFile(Direct3D.GetDevice(), &quot;monster.bmp&quot;);		   
 osMonster-&gt;setSpritePosition(rand()%800, rand()%600);
 osMonster_List.push_back(osMonster);
 k++;
}
</code></pre>
<p>Nun möchte ich, wenn ich mit dem Mauszeiger über so ein Objekt (also in dem Fall ein Monster-Sprite) fahre und draufklicke, dieses Objekt aus der Liste löschen.<br />
Dafür habe ich mir folgenden Code überlegt, der jedoch nicht richtig funktioniert:</p>
<pre><code>case WM_LBUTTONDOWN:
[...]
POINT pt; 
GetCursorPos(&amp;pt);
for(it=osMonster_List.begin();it!=osMonster_List.end();it++) {
	if( (pt.x &gt; (*it)-&gt;getSpritePosition().x) &amp;&amp; (pt.x &lt; (*it)-&gt;getSpritePosition().x + SpriteWidth) 
&amp;&amp; (pt.y &gt; (*it)-&gt;getSpritePosition().y) &amp;&amp; (pt.y &lt; (*it)-&gt;getSpritePosition().y + SpriteHeight) ) {
   delete *it;	
   it = osMonster_List.erase(it);				   
   }
}
</code></pre>
<p>Das scheint nur manchma spontan zu funktionieren. Ich kann 2-3 Sprites anklicken , aber dann stürzt mir das Programm mit der Meldung: &quot;List iterator not incrementable&quot; ab :(!</p>
<p>Ich nutze Microsoft Visual Studio 2005 und DirectX9.</p>
<p>Bin für jede Hilfe äußerst dankbar!</p>
<p>Tschau<br />
Sandro</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363426</guid><dc:creator><![CDATA[skummy]]></dc:creator><pubDate>Tue, 11 Sep 2007 14:54:05 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt aus Liste löschen (List iterator not incrementable) on Tue, 11 Sep 2007 15:33:51 GMT]]></title><description><![CDATA[<p>skummy schrieb:</p>
<blockquote>
<p>.. Das scheint nur manchma spontan zu funktionieren. Ich kann 2-3 Sprites anklicken , aber dann stürzt mir das Programm mit der Meldung: &quot;List iterator not incrementable&quot; ab :(!</p>
</blockquote>
<p>Du darfst den Iterator dann nicht mehr inkrementieren, wenn Du ihn bereits als return-Code von erase bekommen hast. Denn dieser kann bereits der Ende-Iterator sein, beim Löschen des letzten Elements in der Liste. Also besser:</p>
<pre><code class="language-cpp">case WM_LBUTTONDOWN:
    // [...]
    POINT pt;
    GetCursorPos(&amp;pt);
    for(it=osMonster_List.begin();it!=osMonster_List.end();) {
        if( /* Monster mit Maus getroffen */ ) {
            delete *it;   
            it = osMonster_List.erase(it); 
            // it zeigt jetzt bereits auf das nächste Element hinter dem gelöschten                  
        }
        else
            ++it;   // nur inkrementieren, falls es nicht gelöscht wurde
    }
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363455</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 11 Sep 2007 15:33:51 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt aus Liste löschen (List iterator not incrementable) on Tue, 11 Sep 2007 16:00:42 GMT]]></title><description><![CDATA[<p>Geht auch nicht.</p>
<p>Ich habe aber inzwischen herausgefunden, dass nach dem erase ein &quot;return 0;&quot; folgen muss.<br />
Warum das aber so sein muss, entzieht sich meines Wissens...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363474</guid><dc:creator><![CDATA[skummy]]></dc:creator><pubDate>Tue, 11 Sep 2007 16:00:42 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt aus Liste löschen (List iterator not incrementable) on Tue, 11 Sep 2007 16:06:47 GMT]]></title><description><![CDATA[<p>skummy schrieb:</p>
<blockquote>
<p>Geht auch nicht.</p>
</blockquote>
<p>doch doch! Hast Du auch nicht vergessen das it++ in der for-Schleife zu löschen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363480</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 11 Sep 2007 16:06:47 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt aus Liste löschen (List iterator not incrementable) on Tue, 11 Sep 2007 17:00:19 GMT]]></title><description><![CDATA[<p>Ohhh...du versteckst dich doch in meinem Zimmer und kannst auf meinen Quelltext schauen ;)!</p>
<p>Spaß bei Seite...du hattest Recht. Ich hab vergessen das it++ in der for-Schleife zu entfernen. Jetzt funktioniert alles bestens :)! Auch ohne die &quot;return 0;&quot;-Zeile</p>
<p>Vielen vielen Dank an dich!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363513</guid><dc:creator><![CDATA[skummy]]></dc:creator><pubDate>Tue, 11 Sep 2007 17:00:19 GMT</pubDate></item></channel></rss>