<?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[Mit Iterator auf Member-Funktion zugreifen]]></title><description><![CDATA[<p>Hey Leute,<br />
ich habe ein Problem, ich weiß nicht, bzw bekomme es nicht hin, mit einem Iterator auf eine Memberfunktion einer Klasse zuzugreifen.</p>
<p>als Beispiel:<br />
[cpp]<br />
std::vector&lt;myClass*&gt; data;<br />
std::vector&lt;myClass*&gt;::iterator theIt;</p>
<p>for( theIt = data.begin(); theIt != data.end(); ++theIt )<br />
{<br />
theIt-&gt;getName(); // getName ist eine Memberfunktion der Klasse data;<br />
}<br />
[cpp]</p>
<p>Jedoch geht dies leider nicht, ich bekomme immer den Fehler:<br />
error: request for member 'getName' in '*(((_gnu_cxx::_normal_iterator&lt;Item**......</p>
<p>Hoffe ihr könnt mir helfen.<br />
Klar ich könnte das ganze auch mit dem Index operator [] lösen, aber geht das nicht auch mit dem Iterator=</p>
<p>Danke schonmal=)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262138/mit-iterator-auf-member-funktion-zugreifen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 19:46:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262138.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 01 Mar 2010 16:10:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mit Iterator auf Member-Funktion zugreifen on Mon, 01 Mar 2010 16:10:01 GMT]]></title><description><![CDATA[<p>Hey Leute,<br />
ich habe ein Problem, ich weiß nicht, bzw bekomme es nicht hin, mit einem Iterator auf eine Memberfunktion einer Klasse zuzugreifen.</p>
<p>als Beispiel:<br />
[cpp]<br />
std::vector&lt;myClass*&gt; data;<br />
std::vector&lt;myClass*&gt;::iterator theIt;</p>
<p>for( theIt = data.begin(); theIt != data.end(); ++theIt )<br />
{<br />
theIt-&gt;getName(); // getName ist eine Memberfunktion der Klasse data;<br />
}<br />
[cpp]</p>
<p>Jedoch geht dies leider nicht, ich bekomme immer den Fehler:<br />
error: request for member 'getName' in '*(((_gnu_cxx::_normal_iterator&lt;Item**......</p>
<p>Hoffe ihr könnt mir helfen.<br />
Klar ich könnte das ganze auch mit dem Index operator [] lösen, aber geht das nicht auch mit dem Iterator=</p>
<p>Danke schonmal=)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862815</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Mon, 01 Mar 2010 16:10:01 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Iterator auf Member-Funktion zugreifen on Mon, 01 Mar 2010 16:21:31 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">std::vector&lt;myClass*&gt; data;
std::vector&lt;myClass*&gt;::iterator theIt;

for( theIt = data.begin(); theIt != data.end(); ++theIt )
{
  (*theIt)-&gt;getName(); // getName ist eine Memberfunktion der Klasse data;
}
</code></pre>
<p>Oder wenn es möglich ist die boost::ptr-container verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862819</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Mon, 01 Mar 2010 16:21:31 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Iterator auf Member-Funktion zugreifen on Mon, 01 Mar 2010 18:49:27 GMT]]></title><description><![CDATA[<p>Vielen Dank, hat einwandfrei funktioniert;-)</p>
<p>Habe aber noch eine andere Frage, kann ich auch in einer Schleife wie oben Suchen, ob das Objekt auf das der Iterator zeigt ein bestimmtes ist, und falls ja dieses löschen?</p>
<p>Funktioniert</p>
<pre><code class="language-cpp">delete (*theIt);
</code></pre>
<p>?</p>
<p>Danke schonmal</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862927</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Mon, 01 Mar 2010 18:49:27 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Iterator auf Member-Funktion zugreifen on Mon, 01 Mar 2010 19:08:47 GMT]]></title><description><![CDATA[<p>Nein, <code>delete</code> darfst du nur auf Zeiger anwenden, deren Speicherbereich du mit <code>new</code> angefordert hast. Was du suchst, ist die Memberfunktion <code>erase()</code> , nachzulesen auf <a href="http://www.cplusplus.com" rel="nofollow">www.cplusplus.com</a>. Vorsicht, die Löschung invalidiert meist darauffolgende Iteratoren, also beim Durchiterieren den Rückgabewert von <code>erase()</code> einsetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862944</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 01 Mar 2010 19:08:47 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Iterator auf Member-Funktion zugreifen on Mon, 01 Mar 2010 20:00:09 GMT]]></title><description><![CDATA[<p>Ok erst mal Danke=)</p>
<p>Folgendes Beispiel:</p>
<pre><code class="language-cpp">void Inventar::itemLoeschen()
{
    for( theIt = items.begin(); theIt != items.end(); ++theIt )
    {
        if( ( *theIt )-&gt;getVerfuegbarkeit() == 0 )
        {
            theIt = items.erase( theIt );
            cout &lt;&lt; &quot;\n&quot; &lt;&lt; ( *theIt )-&gt;getName() &lt;&lt; &quot; wurde gelöscht\n&quot;;
        }
    }
}
</code></pre>
<p>Wenn ich das ganze so löse, dann wird ja theIt nachdem ein Element gelöscht wurde, wird ja theIt auf das Element danach gerichtet.<br />
So aber dann wird ja nachdem Schleifendurchlauf wieder um eins erhöht, es heißt das eine Element nach dem gelöschen wird übersprungen.</p>
<p>Soll ich das ganze dann so lösen:</p>
<pre><code class="language-cpp">void Inventar::itemLoeschen()
{
    for( theIt = items.begin(); theIt != items.end(); ++theIt )
    {
        if( ( *theIt )-&gt;getVerfuegbarkeit() == 0 )
        {
            items.erase( theIt );
            cout &lt;&lt; &quot;\n&quot; &lt;&lt; ( *theIt )-&gt;getName() &lt;&lt; &quot; wurde gelöscht\n&quot;;
        }
    }
}
</code></pre>
<p>Funktioniert das so?<br />
Danke schonmal</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862959</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Mon, 01 Mar 2010 20:00:09 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Iterator auf Member-Funktion zugreifen on Mon, 01 Mar 2010 20:09:04 GMT]]></title><description><![CDATA[<p>Nein. Eher so:</p>
<pre><code class="language-cpp">void Inventar::itemLoeschen()
{
    for( theIt = items.begin(); theIt != items.end(); )
    {
        if( ( *theIt )-&gt;getVerfuegbarkeit() == 0 )
        {
            theIt = items.erase( theIt );
            cout &lt;&lt; &quot;\n&quot; &lt;&lt; ( *theIt )-&gt;getName() &lt;&lt; &quot; wurde gelöscht\n&quot;;
        }
        else
          ++theIt;
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1862967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862967</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 01 Mar 2010 20:09:04 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Iterator auf Member-Funktion zugreifen on Mon, 01 Mar 2010 20:13:22 GMT]]></title><description><![CDATA[<p>fr33g schrieb:</p>
<blockquote>
<p>Soll ich das ganze dann so lösen:</p>
<pre><code class="language-cpp">void Inventar::itemLoeschen()
{
    for( theIt = items.begin(); theIt != items.end(); ++theIt )
    {
        if( ( *theIt )-&gt;getVerfuegbarkeit() == 0 )
        {
            items.erase( theIt );
            cout &lt;&lt; &quot;\n&quot; &lt;&lt; ( *theIt )-&gt;getName() &lt;&lt; &quot; wurde gelöscht\n&quot;;
        }
    }
}
</code></pre>
</blockquote>
<p>Nein, das macht deinen Iterator ungültig. Sobald <code>erase()</code> zum Aufrufer zurückkehrt, ist jeder Zugriff auf folgende Iteratoren und insbesondere <code>theIt</code> selbst undefiniert.</p>
<p>Eine Lösung könnte so aussehen:</p>
<pre><code class="language-cpp">void Inventar::itemLoeschen()
{
    for( theIt = items.begin(); theIt != items.end(); /* nichts */)
    {
        if( ( *theIt )-&gt;getVerfuegbarkeit() == 0 )
            theIt = items.erase( theIt );
        else
            ++theIt;
    }
}
</code></pre>
<p>Für genau diesen Zweck existiert übrigens der STL-Algorithmus <code>std::remove_if()</code> .</p>
<pre><code class="language-cpp">bool itemNichtVerfuegbar(const Item* item)
{
    return (item-&gt;getVerfuegbarkeit() == 0);
}

void Inventar::itemLoeschen()
{
    std::remove_if(items.begin(), items.end(), &amp;itemNichtVerfuegbar);
}
</code></pre>
<p>Wichtig: Ich bin hier von nicht-besitzenden Zeigern ausgegangen.</p>
<p>Falls du die Zeiger mit <code>new</code> anforderst, musst du sie mit <code>delete</code> freigeben. Dadurch wird die Sache unnötigerweise massiv komplizierter und fehleranfälliger, vermeide manuelle Speicherverwaltung wo möglich. Falls der Container die Gegenstände tatsächlich besitzen sollte: Gibt es einen Grund, weshalb du <code>std::vector&lt;Item*&gt;</code> und nicht <code>std::vector&lt;Item&gt;</code> benutzt? Bei der zweiten Variante brauchst du dich nämlich nicht um Speicher zu kümmern.</p>
<p>Übrigens, aber das ist eher Geschmackssache: Ich persönlich würde mich für eine Sprache entscheiden. Also &quot;RemoveItem&quot; oder &quot;LoescheGegenstand&quot; (wobei ich zu englisch tendiere). Finde ich einfach konsistenter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1862969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1862969</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 01 Mar 2010 20:13:22 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Iterator auf Member-Funktion zugreifen on Tue, 02 Mar 2010 07:58:41 GMT]]></title><description><![CDATA[<p>Erst mal Danke für die Antworten,<br />
zu der Frage warum ich zeiger auf Items im Vektor speichere.<br />
Item ist die Basisklasse, diese hat nun wieder 3 Kindklassen, welche wieder eigene Kindklasse haben. Ich dachte wenn ich jetzt im Vektor nur Items speichere, dann kann ich auch nur Items und nich die Spezialisierung, sprich ich müsste für jede Klasse nen eigenen Vektor erstellen.<br />
Oder bin ich da der Annahme falsche und das funktioniert als wie ich es mit einem Zeiger auf Item löse?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863081</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Tue, 02 Mar 2010 07:58:41 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Iterator auf Member-Funktion zugreifen on Tue, 02 Mar 2010 08:04:05 GMT]]></title><description><![CDATA[<p>Es ist schon richtig das du Zeiger verwendest in diesem Fall, aber eventuell solltest du dabei auf einen Smart Pointer zurückgreifen um memory leaks zu vermeiden. boost::shared_ptr&lt;&gt; z.B.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863083</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Tue, 02 Mar 2010 08:04:05 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Iterator auf Member-Funktion zugreifen on Tue, 02 Mar 2010 09:05:20 GMT]]></title><description><![CDATA[<p>Ok, habe schon öfters was von Smart Pointer gehört, jedoch weiß ich nicht was sie sind und wie man sie benutzt.<br />
Aber werde mich da jetzt mal im Internet schlau machen und sie gegeben falls nutzen.<br />
Weiß jetzt immerhin dass mein Ansatz das mit Zeigern zu lösen richtig war=)</p>
<p>Leute, ich bekomme die Boost Bibliothek irgendwie nicht installiert.<br />
Hab schon reichlich gegoogelt und auch getStarted bei boost durchgelesen.</p>
<p>Ich soll doch die build.bat ausführen, und dannach die daraus resultierende exe<br />
Jedoch komm ich soweit gar nicht, bekomme immer beim ausführen der build.bat fehler:</p>
<p><a href="http://img7.imageshack.us/img7/8372/boostfehler.png" rel="nofollow">http://img7.imageshack.us/img7/8372/boostfehler.png</a></p>
<p>Hoffe ihr könnt mir helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863085</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863085</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Tue, 02 Mar 2010 09:05:20 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Iterator auf Member-Funktion zugreifen on Tue, 02 Mar 2010 09:21:00 GMT]]></title><description><![CDATA[<p>&quot;Boost installieren&quot; ist in den meisten Fällen überflüssig. Du extrahierst die Header die du brauchst und bindest die in dein Objekt ein. Fertig.</p>
<p>Sachen wie boost::signals oder boost::filesystem brauchen hingegen eine kompilierte Bibliothek. Aber das interessiert dich im Moment noch nicht.<br />
shared_ptr kommt ohne lib zurecht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863128</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 02 Mar 2010 09:21:00 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Iterator auf Member-Funktion zugreifen on Tue, 02 Mar 2010 09:27:29 GMT]]></title><description><![CDATA[<p>Wie meinst du ich extrahiere die Header-Datei???<br />
Und wo muss ich sie hinextrahieren, bzw kopieren?<br />
In das mingw verzeichnis?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863144</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Tue, 02 Mar 2010 09:27:29 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Iterator auf Member-Funktion zugreifen on Tue, 02 Mar 2010 09:46:11 GMT]]></title><description><![CDATA[<p>Wohin spielt keine Rolle, du musst den Pfad nur in deinen Compiler Settings in den Include Suchpfad aufnehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863164</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Tue, 02 Mar 2010 09:46:11 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Iterator auf Member-Funktion zugreifen on Tue, 02 Mar 2010 09:59:30 GMT]]></title><description><![CDATA[<p>Boost kommt doch in einem riesigen fetten .tar.bz2 (oder .zip, weiß grad nicht ob die für Windows was eigenes schnüren...)<br />
Das entpacken und in das erstellte Verzeichnis reingehen. Dort das Verzeichnis &quot;boost&quot; in deinen Projekttree kopieren. Danach kannst du alles rausschmeißen was du nicht brauchst. Schau in den Header &quot;boost/shared_ptr.hpp&quot;, was includiert wird. So kannst du die weiterhangeln. Übrig bleiben wird eine Hand voll Headerdateien. Die brauchen nicht wirklich viel Platz, und wenn du dein Projekt auslieferst muss sich derjenige nicht auch gleich boost zum Kompilieren zulegen...<br />
Alternativ boost entzippen und das Verzeichnis bei den Include-Pfaden mit angeben.<br />
Siehe auch hier<br />
<a href="http://www.boost.org/doc/libs/1_42_0/more/getting_started/windows.html#header-only-libraries" rel="nofollow">http://www.boost.org/doc/libs/1_42_0/more/getting_started/windows.html#header-only-libraries</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863175</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 02 Mar 2010 09:59:30 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Iterator auf Member-Funktion zugreifen on Tue, 02 Mar 2010 11:17:04 GMT]]></title><description><![CDATA[<p>Wenn man nur besitzende Zeiger in Containern speichern will, sind Boosts <a href="http://www.boost.org/doc/libs/1_42_0/libs/ptr_container/doc/ptr_container.html" rel="nofollow">Pointer-Container</a> weitaus sinnvoller als Smart-Pointer. Die Benutzung ist intuitiver, weil die Schnittstelle weitgehend zur STL kompatibel ist und man nicht zusätzlich dereferenzieren muss. Nullzeiger sind standardmässig verboten. Ausserdem sind die Pointer-Container exceptionsicher und haben keinen unnötigen Overhead für eine Shared-Semantik.</p>
<p>Kurz: Sie sind für den Fall hier geradezu ideal.</p>
<pre><code class="language-cpp">boost::ptr_vector&lt;Item&gt; items;
items.push_back(new SpecialItem); // SpecialItem erbt von Item

items[0].DoSomething(); // operator. und nicht operator-&gt;

boost::ptr_vector&lt;Item&gt;::iterator itr = items.begin();
itr-&gt;DoSomething(); // itr-&gt;DoSomething() und nicht (*itr)-&gt;DoSomething()
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1863220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863220</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 02 Mar 2010 11:17:04 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Iterator auf Member-Funktion zugreifen on Tue, 02 Mar 2010 12:50:45 GMT]]></title><description><![CDATA[<p>Hey Leute,<br />
vielen Dank für die vielen Infos und Tipps.<br />
Werd mich jetzt mal bissel durch die Boost Doku durchkämpfen und sie dann in meinem Projekt einsetzen;-)<br />
Danke schonmal=)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863275</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Tue, 02 Mar 2010 12:50:45 GMT</pubDate></item><item><title><![CDATA[Reply to Mit Iterator auf Member-Funktion zugreifen on Tue, 02 Mar 2010 13:27:34 GMT]]></title><description><![CDATA[<p>fr33g schrieb:</p>
<blockquote>
<p>Hey Leute,<br />
vielen Dank für die vielen Infos und Tipps.<br />
Werd mich jetzt mal bissel durch die Boost Doku durchkämpfen und sie dann in meinem Projekt einsetzen;-)<br />
Danke schonmal=)</p>
</blockquote>
<p>Ich freu´ mich schon auf die Aha!, Oha! und Nein, sowas! Effekte <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/1863298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863298</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Tue, 02 Mar 2010 13:27:34 GMT</pubDate></item></channel></rss>