<?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[Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern]]></title><description><![CDATA[<p>Guten Morgen allerseits <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>
<p>Ich komme hier an einer Stelle nicht weiter mit meinem Programm, also stell ich es zur Debatte <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>
<p>In einem automatisierten Durchlauf über einen File, erzeuge ich aus den Infos in den Zeilen Objekte verschiedener Klassen und hänge sie an meinenm Elemente-Vector dran. Dann will ich in einem weiteren Schritt ein bestimmtes Element im Vector finden und zusätzliche Attribute setzen:</p>
<pre><code class="language-cpp">ElemVec.push_back(new ElemKreis(string Label_, string Farbe_));
. . .
std::vector&lt;ElemVec&gt;::const_iterator itElem = std::find_if(ElemVec.begin(), ElemVec.end(), FindObj(Label_));
std::cout &lt;&lt; itElem -&gt; Farbe &lt;&lt; endl;
// z. B. Blue
(*itElem).Farbe = &quot;Red&quot;;
std::cout &lt;&lt; itElem -&gt; Farbe &lt;&lt; endl;
// Funktioniert nicht
</code></pre>
<p>Mache ich n Denkfehler? Ich will an dem Elementen, auf dem itElem zeigt etwas verändern, für mich sieht (*itElem).Farbe = &quot;Red&quot; in bester Ordnung aus <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>
<p>Viele Grüße,<br />
C.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/277337/vector-aus-objekten-gt-auf-objekte-über-den-iterator-zugreifen-und-verändern</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 20:06:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277337.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 17 Nov 2010 09:09:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 09:09:55 GMT]]></title><description><![CDATA[<p>Guten Morgen allerseits <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>
<p>Ich komme hier an einer Stelle nicht weiter mit meinem Programm, also stell ich es zur Debatte <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>
<p>In einem automatisierten Durchlauf über einen File, erzeuge ich aus den Infos in den Zeilen Objekte verschiedener Klassen und hänge sie an meinenm Elemente-Vector dran. Dann will ich in einem weiteren Schritt ein bestimmtes Element im Vector finden und zusätzliche Attribute setzen:</p>
<pre><code class="language-cpp">ElemVec.push_back(new ElemKreis(string Label_, string Farbe_));
. . .
std::vector&lt;ElemVec&gt;::const_iterator itElem = std::find_if(ElemVec.begin(), ElemVec.end(), FindObj(Label_));
std::cout &lt;&lt; itElem -&gt; Farbe &lt;&lt; endl;
// z. B. Blue
(*itElem).Farbe = &quot;Red&quot;;
std::cout &lt;&lt; itElem -&gt; Farbe &lt;&lt; endl;
// Funktioniert nicht
</code></pre>
<p>Mache ich n Denkfehler? Ich will an dem Elementen, auf dem itElem zeigt etwas verändern, für mich sieht (*itElem).Farbe = &quot;Red&quot; in bester Ordnung aus <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>
<p>Viele Grüße,<br />
C.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981568</guid><dc:creator><![CDATA[Cordula]]></dc:creator><pubDate>Wed, 17 Nov 2010 09:09:55 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 09:15:51 GMT]]></title><description><![CDATA[<p>1. &quot;Funktioniert nicht&quot; ist keine gute Beschreibung.<br />
2. Das <em>const</em> bei <code>const_iterator</code> sollte dir zu denken geben <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="😉"
    /> =&gt; raus damit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981572</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 17 Nov 2010 09:15:51 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 09:30:36 GMT]]></title><description><![CDATA[<p>Dein Vektor beheimatet doch Zeiger auf Objekte?!<br />
Dementsprechend mußt Du aus</p>
<pre><code class="language-cpp">(*itElem).Farbe
</code></pre>
<pre><code class="language-cpp">(*itElem)-&gt;Farbe
</code></pre>
<p>machen.<br />
Trotzdem mußt Du natürlich einen nichtkonstanten Iterator nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981576</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 17 Nov 2010 09:30:36 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 09:43:27 GMT]]></title><description><![CDATA[<p>Und der Preis geht an .. Michael E.! <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="🙂"
    /><br />
Das war wirklich das const bei dem const_iterator.</p>
<p>Sonst sind in dem Vector Objekte, keine Zeiger - (*itElem).Farbe war schon richtig <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>
<p>3246725 Dank <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/1981581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981581</guid><dc:creator><![CDATA[Cordula]]></dc:creator><pubDate>Wed, 17 Nov 2010 09:43:27 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 09:54:17 GMT]]></title><description><![CDATA[<p>Cordula schrieb:</p>
<blockquote>
<p>Sonst sind in dem Vector Objekte, keine Zeiger</p>
</blockquote>
<p>Dann hab ich das hier:</p>
<pre><code class="language-cpp">ElemVec.push_back(new ElemKreis(string Label_, string Farbe_));
</code></pre>
<p>nicht verstanden ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981590</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 17 Nov 2010 09:54:17 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 10:00:43 GMT]]></title><description><![CDATA[<p>Cordula schrieb:</p>
<blockquote>
<p>Sonst sind in dem Vector Objekte, keine Zeiger - (*itElem).Farbe war schon richtig <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>
</blockquote>
<p>In einem nicht leeren std::vector&lt;&gt; sind immer Objekte -- auch wenn es Zeiger-Objekte sind. Wenn (*itElem).Farbe richtig sein soll, dann hast Du in Deinem ersten Beitrag gelogen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981593</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 17 Nov 2010 10:00:43 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 10:31:51 GMT]]></title><description><![CDATA[<p>Beides ist richtig!</p>
<p>Entweder dereferenzieren und Punktoperator:</p>
<pre><code class="language-cpp">(*itElem).Farbe
</code></pre>
<p>oder Zeigeroperator:</p>
<pre><code class="language-cpp">itElem-&gt;Farbe
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1981606</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981606</guid><dc:creator><![CDATA[HighLigerBiMBam]]></dc:creator><pubDate>Wed, 17 Nov 2010 10:31:51 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 10:43:07 GMT]]></title><description><![CDATA[<p>Ähh ... ne.</p>
<pre><code class="language-cpp">(*itElem)
</code></pre>
<p>gibt doch das gespeicherte Element zurück(itElem ist ja 'nur' der Iterator).<br />
Das gespeichert Element sollte aber nach</p>
<pre><code class="language-cpp">ElemVec.push_back(new ElemKreis(string Label_, string Farbe_));
</code></pre>
<p>ein Zeiger sein?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981613</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 17 Nov 2010 10:43:07 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 11:13:52 GMT]]></title><description><![CDATA[<p>Und ElemVec ist darüber hinaus auch noch ein Typ <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/1981628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981628</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 17 Nov 2010 11:13:52 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 15:20:07 GMT]]></title><description><![CDATA[<p>Ähm .. liebe Leute, ihr verwandelt das Wenige was ich (denke dass ich) weiß in einem unüberschaubaren explosiven Wirrwarr mit unerklärlichen verknotteten Zusammenhängen.</p>
<p>Also, nochmal, zu meinem Verständnis:</p>
<p>Ich habe die Klasse ElemGeomForm mit Unterklassen ElemKreis und ElemRechteck.<br />
Ich erzeuge Objekte der Klassen ElemKreis und ElemRechteck mittels einem erweiterten Konstruktor, z. B. von verschiedenen Farben:</p>
<pre><code class="language-cpp">ElemKreis::ElemKreis(string Label_, string Farbe_):Label(Label_), Farbe(Farbe_){}
</code></pre>
<p>Diese Objekte packe ich in einem ElemVec, der definiert ist als:</p>
<pre><code class="language-cpp">vector&lt;ElemGeomForm&gt; ElemVec;
ElemVec.push_back(new ElemKreis(string Label_, string Farbe_));
</code></pre>
<p>Also was ich wollte, als ich das geschrieben habe war, dass in dem Vector das jeweilige Objekt der jeweiligen Klasse (ElemKreis oder ElemRechteck) gescpeichert wird, weil sie ja von ElemGeomForm abgeleitet worden sind, somit sind sie ElemGeomForm-s. Der Iterator ist dann der Zeiger auf das jeweilige Element im Vector.</p>
<p>Stimmt das so?</p>
<p>Ich wollte 'in meinem ersten Beitrag' nicht lügen, ich versteh es so <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/1981770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981770</guid><dc:creator><![CDATA[Cordula]]></dc:creator><pubDate>Wed, 17 Nov 2010 15:20:07 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 15:27:42 GMT]]></title><description><![CDATA[<p>Du solltest Code in deinem Editor schreiben, compilieren und dann diesen Code hierein kopieren und mit deinen Compiler- /Laufzeitfehlern kommen.<br />
Nicht irgendwelche spontan zusammengedichtete falschen Codefetzen hier reintippern. Du vertauschst Namen und Typen, Deklarationen und Aufrufe, wir lesen hier nur totalen Unsinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981782</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Wed, 17 Nov 2010 15:27:42 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 15:33:47 GMT]]></title><description><![CDATA[<p>Cordula schrieb:</p>
<blockquote>
<p>ElemVec.push_back(new ElemKreis(string Label_, string Farbe_));</p>
</blockquote>
<p>Das wird sicher nicht gehen. Der Vector reserviert doch für dich den Speicher. Ansonsten müsstest du Zeiger in den Vector legen, dann würde es wenigstens Sinn machen.</p>
<pre><code class="language-cpp">ElemVec.push_back(ElemKreis(string Label_, string Farbe_));
</code></pre>
<p>Wie kann ElemKreis in einen vector &lt;ElemGeomForm&gt;? Ist der abgeleitet?</p>
<p>Welche Fehlermeldungen hast du denn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981790</guid><dc:creator><![CDATA[HighLigerBiMBam]]></dc:creator><pubDate>Wed, 17 Nov 2010 15:33:47 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 15:56:28 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9203">@brotbernd</a>: Genau das mach ich, zum Testen nehme ich aber halt nur den Teil aus dem ganzen Code der mich gerade interessiert und schreibe ein kleines Testprogramm, an dem ich ruhig rumprobieren kann, ohne dass ich meinen sonst lauffähigen Code aus Versehen verstümmel (alles schon da gewesen ..) Die Kritik über die Compiler-Fehlermeldungen werd ich mir aber zu Herzen nehmen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24205">@HighLigerBiMBam</a>: ElemKreis erbt von ElemGeomForm</p>
<pre><code class="language-cpp">class ElemKreis:public ElemGeomForm
</code></pre>
<p>- also denke ich, er müßte auch in dem Vector mit Objekten vom Typ ElemGeomForm eingefügt werden können - oder nicht?</p>
<p>Fehlermeldung:</p>
<blockquote>
<p>c:\documents and settings\cordula\my documents\visual studio 2008\projects\parser\parser\parser.cpp(208) : error C2664: 'std::vector&lt;_Ty&gt;::push_back' : cannot convert parameter 1 from 'ElemKreis *' to 'const ElemGeomForm &amp;'<br />
1&gt; with<br />
1&gt; [<br />
1&gt; _Ty=ElemGeomForm<br />
1&gt; ]<br />
1&gt; Reason: cannot convert from 'ElemKreis *' to 'const ElemGeomForm'<br />
1&gt; No constructor could take the source type, or constructor overload resolution was ambiguous</p>
</blockquote>
<p>Gut, der Fehlermeldung nach offensichtlich nicht - aber warum nicht? ElemKreis 'ist ein' ElemGeomForm?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981799</guid><dc:creator><![CDATA[Cordula]]></dc:creator><pubDate>Wed, 17 Nov 2010 15:56:28 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 16:00:32 GMT]]></title><description><![CDATA[<p>Der Fehler kommt wegen <strong>new</strong>!!! Siehe mein Post.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981803</guid><dc:creator><![CDATA[HighLigerBiMBam]]></dc:creator><pubDate>Wed, 17 Nov 2010 16:00:32 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 17:12:17 GMT]]></title><description><![CDATA[<p>Super, dann war meine Denkweise doch nicht ganz so falsch. Danke.</p>
<p>Die 254 Fehler die dann kamen hab ich auf 28 reduziert. Und folgende Fehlermeldung find ich sehr unverständlich:</p>
<blockquote>
<p>1&gt;c:\documents and settings\cordula\my documents\visual studio 2008\projects\parser\parser\parser.cpp(238) : error C2440: '&lt;function-style-cast&gt;' : cannot convert from 'std::string' to 'Parser::FindObj'<br />
1&gt; Source or target has incomplete type</p>
</blockquote>
<p>Es geht um ein Functor, der den Predicate für das find_if definiert:</p>
<pre><code class="language-cpp">struct FindObj{
private:
	string SearchString_;
public:
	FindObj(string Name) : SearchString_(Name){}
	//bool operator()(const ElemGeomForm&amp; findForm){
	bool operator()(const ElemGeomForm&amp; findForm){
		return findForm.Label == SearchString_;
	}
};
</code></pre>
<p>und das ruf ich auf mit</p>
<pre><code class="language-cpp">string Label_ = FileLine.substr(18, 50);
vector&lt;ElemGeomForm&gt;::iterator itElem = find_if(ElemVec.begin(), ElemVec.end(), FindObj(Label_));
</code></pre>
<p>Fällt's auf wie viel Mühe ich mir gegeben habe alles ausführlich und übersichtlich zu posten? <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/1981843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981843</guid><dc:creator><![CDATA[Cordula]]></dc:creator><pubDate>Wed, 17 Nov 2010 17:12:17 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 17:21:24 GMT]]></title><description><![CDATA[<p>Hast du findobj.h oder wo FindObj auch immer definiert ist, included?<br />
Falls nein: schnell nachholen.</p>
<p>HighLigerBiMBam  schrieb:</p>
<blockquote>
<p>Der Fehler kommt wegen new!!! Siehe mein Post.</p>
</blockquote>
<p>Du must dich nicht mit fremden Federn schmücken, der Hinweis ist schon im zweiten Post angebracht.</p>
<p>Dein vector&lt;ElemGeomForm&gt; provoziert aber ein <a href="http://de.wikipedia.org/wiki/Slicing" rel="nofollow">Slicing</a>-Problem, wenn du ein ElemKreis hinzufügst. Ist vielleicht etwas schwierig zu verstehen aber dein ElemKreis wird nur als ElemGeomForm gespeichert. Umgehen kannst du das Problem, wenn du den Vektor als vector&lt;ElemGeomForm*&gt; definierst und die Objekte trotz allem wieder mit new hinzufügst.</p>
<p>PS: dein Post ist wirklich sehr übersichtlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981854</guid><dc:creator><![CDATA[mabmib]]></dc:creator><pubDate>Wed, 17 Nov 2010 17:21:24 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 17:26:32 GMT]]></title><description><![CDATA[<p>mabmib schrieb:</p>
<blockquote>
<p>Du must dich nicht mit fremden Federn schmücken, der Hinweis ist schon im zweiten Post angebracht.</p>
</blockquote>
<p>Ja wurde aber nicht verstanden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981862</guid><dc:creator><![CDATA[HighLigerBiMBam]]></dc:creator><pubDate>Wed, 17 Nov 2010 17:26:32 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 17:51:38 GMT]]></title><description><![CDATA[<p>@mabmib:<br />
Die Deklaration von struct ist in dem Header, ist eingefügt, und die Definiton steht über dem main, daran liegt es nicht.</p>
<p>Das mit dem Slicing war wirklich ein Tick zu komplex .. Aber ok, hab ich geändert. Wie kann ich dann die Attribute von dem Objekt auf dem der Iterator zeigt ändern? Mit</p>
<pre><code class="language-cpp">(*itElem).Farbe = FileZeile.substr(18, 50);
</code></pre>
<p>geht es ja nicht mehr, weil der Iterator auf einem Zeiger zeigt und nicht auf dem Objekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981873</guid><dc:creator><![CDATA[Cordula]]></dc:creator><pubDate>Wed, 17 Nov 2010 17:51:38 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 18:01:54 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;algorithm&gt;

class Element
{
public:
	Element(const std::string&amp; label):
	  label_(label), farbe_(0)
	{}
	const std::string&amp; Label() const {return label_;}

	void SetFarbe(int farbe)
	{
		farbe_ = farbe;
	}
private:
	std::string label_;
	int farbe_;
};

class Kreis : public Element
{
public:
	Kreis(const std::string&amp; label, double center, double radius) :
	  Element(label), center_(center), radius_(radius)
	{}
private:
	double center_, radius_;
};

struct FindLabel
{
	FindLabel(const std::string&amp; label) : l(label){}
	bool operator()(const Element* e) const{
		return e-&gt;Label() == l;
	}
	std::string l;
};

template&lt;typename T&gt; void Deleter(T* e)
{
	delete e;
}

int main(int argc, char* argv[])
{
	using namespace std;
	typedef vector&lt;Element*&gt; ElementVector;

	ElementVector elements;
	elements.push_back(new Kreis(&quot;Rund&quot;, 0, 1.23));
	elements.push_back(new Kreis(&quot;Piiii&quot;, 0, 3.14));

	ElementVector::const_iterator cit = find_if(  // konstanter Iterator. kann nix ändern. nur 'lesen'
		elements.begin(), elements.end(), FindLabel(&quot;Rund&quot;));

	if (cit != elements.end())  // etwas gefunden?
		cout &lt;&lt; (*cit)-&gt;Label() &lt;&lt; &quot;\n&quot;;

	ElementVector::iterator it = find_if(  // nicht konstanter Iterator. kann Farbe ändern
		elements.begin(), elements.end(), FindLabel(&quot;Piiii&quot;));

	if (it != elements.end())  // etwas gefunden?
		(*it)-&gt;SetFarbe(3);

	// Alles löschen!
	for_each(elements.begin(), elements.end(), Deleter&lt;Element&gt;);

	return 0;
}
</code></pre>
<p>Einfach mal angucken und drüber nachdenken. Wenn Du es verstanden hast und nachbauen konntest kannst du dich mal informieren was man statt <code>typedef vector&lt;Element*&gt; ElementVector;</code> besser macht (z.B. <code>typedef vector&lt;shared_ptr&lt;Element&gt; &gt; ElementVector;</code> oder <code>boost::ptr_vector&lt;Element&gt;</code> )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981876</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Wed, 17 Nov 2010 18:01:54 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Wed, 17 Nov 2010 20:36:20 GMT]]></title><description><![CDATA[<p>Ich habe es mir so lange angeschaut, dass ich es fast auswendig kann. Ist mir zwar nicht alles glasklar was du gemacht hast, aber ich hab meinen Code dementsprechend geändert. Ungefähr so:</p>
<pre><code class="language-cpp">struct FindLabel{
	string SearchLabel_;
	FindLabel(string Label_) : SearchLabel_(Label_){} 
         // Fehler: 'Label_' : undeclared identifier
	bool operator()(Element* findElem){
		return findElem-&gt;Label == Label_;
	}
};
</code></pre>
<p>Was erzielt man mit</p>
<pre><code class="language-cpp">FindLabel(const std::string&amp; label) : l(label){}
</code></pre>
<p>Bzw., warum deklarierst du den Label als const string&amp;?</p>
<p>Sorry, ich hab so weit zurückgeschraubt bis ich etwas hatte was ich auch selbst schreiben könnte, es macht wenig Sinn abzuschreiben was ich nicht versteh. Nun ja, hier versteh ich nicht woher die Fehlermeldung kommt, ist auch nciht besser.</p>
<pre><code class="language-cpp">class Kreis : public Element
{
public:
    Kreis(const std::string&amp; label, double center, double radius) :
      Element(label), center_(center), radius_(radius)
    {}

    void SetTransparenz(int Transparenz){
        Transp = Transparenz;
    }

private:
    double center_, radius_;
};
    int Transp; // Transparenz 0(min) - 5(max)

    ElementVector::iterator it = find_if(  // nicht konstanter Iterator. kann Farbe ändern
        elements.begin(), elements.end(), FindLabel(&quot;Piiii&quot;));

    if (it != elements.end())  // etwas gefunden?
        (*it)-&gt;SetTransparenz(4); // Fehler: is not a member of 'Element'
</code></pre>
<p>(Wie) Kann ich die Set-Methode der Unterklasse auf dem gefundenen Objekt anwenden? Bzw., dieser Fehler kommt erst nach dem ersten, von daher könnte er auch irrelevant sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981943</guid><dc:creator><![CDATA[Cordula]]></dc:creator><pubDate>Wed, 17 Nov 2010 20:36:20 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Thu, 18 Nov 2010 07:55:23 GMT]]></title><description><![CDATA[<p>Ehrlich gesagt denke ich, dass du dir ganz dringend noch mal ein Grundlagen Buch ansehen solltest. Vielleicht kannst du schon eine andere Sprache und probierst ein bischen C++ aus? Wenn Du noch keins hast, besorg dir mal ein gutes Buch (C++ Primer z.B.).</p>
<p>Zu Deinen Fragen:<br />
Instanzen von Klassen übergibt man meistens oder fast immer als konstante Referenz (const string&amp;). Das ist, was in den vielen anderen Sprachen automatisch passiert, da dort alles eine Referenz ist. In C++ bedeutet die Signatur (string label) aber, dass hier eine Kopie vom string übergeben wird. Um die Kopie einzusparen übergibt man eine Referenz. Und const, damit man das Original nicht verändert kann.</p>
<p>ElementVector ist ein vector&lt;Element*&gt;. Ein ElementVector::iterator ist ein vector&lt;Element*&gt;::iterator. Der * Operator des ElementVector::iterator gibt eine Referenz auf ein Element* zurück.</p>
<pre><code class="language-cpp">(*it)-&gt;SetTransparenz(4);
</code></pre>
<p>ruft also die Methode SetTransparenz mit einem Element* auf. Der Compiler sucht also Element::SetTransparenz. So eine Funktion existiert nicht, denn SetTransparenz hast du in der Kreisklasse definiert. Wenn Du SetTransparent mit einem Element* aufrufen möchtest, muss diese Methode in der Schnittstelle von Element vorhanden sein. Das bedeutet dann aber, dass <strong>alle</strong> Elemente eine Transparenz zugeordnet bekommen können. Wenn das eine reine Kreiseigenschaft ist, musst du dir etwas anderes überlegen. Mit einem Elemen* hast du nur Zugriff auf die Element Schnittstelle, du kannst also nur das machen, was alle Arten von Elementen betrifft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1982073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982073</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Thu, 18 Nov 2010 07:55:23 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Thu, 18 Nov 2010 09:55:39 GMT]]></title><description><![CDATA[<p>Das könnte man z.Bsp. mit einem dynamic_cast lösen (ist aber eigentlich kein guter Stil).</p>
<pre><code class="language-cpp">if (it != elements.end()) { // etwas gefunden?
    Kreis* kreis = dynamic_cast&lt;Kreis*&gt;(*it); // versucht Element* in Kreis* zu verwandeln
    if( kreis != 0) // Ja es ist ein Kreis
        kreis-&gt;SetTransparenz(4);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1982121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1982121</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 18 Nov 2010 09:55:39 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Fri, 19 Nov 2010 19:10:46 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9203">@brotbernd</a>: Ja, du hast es auf den Punkt gebracht. Ich bin Newbie in C++, und weil in dem Buch durch welches ich mich durchgearbeitet habe nichts demgleichen vorkam, hab ich es auch nicht vermisst, weil ich es aus meinen Sprachen nicht kenne. Unglücklich - aber aus Fehlern lernt man.</p>
<p>Für den Fall dass jemand an derselben Stelle Schwierigkeiten hat:<br />
Das 'Problem' habe ich anders gelöst, ich habe die Objekte der abgeleiteten Klassen jeweils in einen eigenen Vektor gepackt. Das hat sich auch für den weiteren Verlauf als vorteilhaft erwiesen, da man auf der Suche nach einem Objekt nur den Vektor genau dieser Objekte durchsuchen muß und nicht den (möglicherweise um ein Mehrfaches) größeren Vektor aller Objekte.</p>
<p>Es belibt eine Stelle offen, und den Fehlre bekomme ich nicht mehr weg (was ich einige Posts weiter oben geschrieben habe)</p>
<pre><code>struct FindObj{
private:
    string SearchString_;
public:
    FindObj(string Name) : SearchString_(Name){}
    bool operator()(const ElemGeomForm&amp; findForm){
        return findForm-&gt;Label == SearchString_;
    }
};
</code></pre>
<p>aufgerufen mit</p>
<pre><code class="language-cpp">string Label_ = FileLine.substr(18, 50);
vector&lt;ElemGeomForm&gt;::iterator itElem = find_if(ElemVec.begin(), ElemVec.end(), FindObj(Label_));
</code></pre>
<p>gibt folgenden Fehler zurück:</p>
<blockquote>
<p>1&gt;error C2440: '&lt;function-style-cast&gt;' : cannot convert from 'std::string' to 'Parser::FindObj'<br />
1&gt; Source or target has incomplete type</p>
</blockquote>
<p>Fällt jemandem was dazu ein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1983052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983052</guid><dc:creator><![CDATA[Cordula]]></dc:creator><pubDate>Fri, 19 Nov 2010 19:10:46 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Fri, 19 Nov 2010 19:35:16 GMT]]></title><description><![CDATA[<pre><code>struct FindObj{
private:
    string SearchString_;
public:
    FindObj(string Name) : SearchString_(Name){}
    bool operator()(const ElemGeomForm&amp; findForm){
        return findForm-&gt;Label == SearchString_;
    }
};
</code></pre>
<p>aufgerufen mit</p>
<pre><code class="language-cpp">string Label_ = FileLine.substr(18, 50);

FindObj fo(Label_);

vector&lt;ElemGeomForm&gt;::iterator itElem = find_if(ElemVec.begin(), ElemVec.end(), fo);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1983056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983056</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Fri, 19 Nov 2010 19:35:16 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Fri, 19 Nov 2010 20:02:50 GMT]]></title><description><![CDATA[<p>Aaaalso:</p>
<p>Du hast doch hier<br />
<strong>vector&lt;ElemGeomForm&gt;</strong>::iterator itElem = find_if(ElemVec.begin(), ElemVec.end(), FindObj(Label_));<br />
einen Vektor mit Elementen vom Typ ElemGeomForm.<br />
Hier:<br />
vector&lt;ElemGeomForm&gt;::iterator itElem = find_if(ElemVec.begin(), ElemVec.end(), <strong>FindObj(Label_)</strong>);<br />
wird der Operator () des temporär erstellten FindObj - Objektes aufgerufen, dem ein solches ElemGeomForm als Parameter mitgegeben wird.<br />
Hier:<br />
bool operator()(const ElemGeomForm&amp; findForm){<br />
return <strong>findForm-&gt;Label</strong> == SearchString_;<br />
}<br />
tust Du aber so, als hättest Du nicht ein ElemGeomForm - Element, sondern einen Zeiger auf ein solches - Du benutzt nämlich den -&gt; Operator anstelle des . Operators.</p>
<p>Da ich anfangs des Threads den Eindruck gewonnen habe, Du weißt selber nicht, was von beiden nun richtig ist, kann ich Dir mehr auch nicht dazu sagen.<br />
Aber eines von beiden muß falsch sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1983062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1983062</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Fri, 19 Nov 2010 20:02:50 GMT</pubDate></item><item><title><![CDATA[Reply to Vector aus Objekten -&amp;gt; auf Objekte über den Iterator zugreifen und verändern on Mon, 22 Nov 2010 09:45:21 GMT]]></title><description><![CDATA[<p>Ich hab im Laufe letzter Woche ziemlich oft was an diesem Vector verändert, aktuell ist es ein Vector aus Zeigern, der auch den Fehler verursacht. Ich definiere dann das struct so:</p>
<pre><code class="language-cpp">struct FindObj{
private:
    string SearchString_;
public:
    FindObj(string Name) : SearchString_(Name){}
    bool operator()(ElemGeomForm* findForm){
        return findForm-&gt;Label == SearchString_;
    }
};
</code></pre>
<p>und ruf es auf mit</p>
<pre><code class="language-cpp">std::vector&lt;ElemGeomForm*&gt;::iterator itElem = find_if(ElemVec.begin(), ElemVec.end(), FindObj(Label_));
</code></pre>
<p>Also wird das erstellte FindObj-Objekt aufgerufen, indem ihm der Zeiger auf dem jeweiligen Objekt mitgegeben wird. Kann das der Grund sein? Es heißt ja &quot;cannot convert from 'std::string' to 'Parser::FindObj'&quot;. Aber wie kann ich das korrigieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1984039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984039</guid><dc:creator><![CDATA[Cordula]]></dc:creator><pubDate>Mon, 22 Nov 2010 09:45:21 GMT</pubDate></item></channel></rss>