<?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[Pointer und Set-Iterator]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte ein Objekt aus einem Iterator einem Pointer auf eine Klasse zuweisen.<br />
Bei folgendem Bsp. s.u. stürzt die exe ab.<br />
Ich habe schon länger rumprobiert, es geht darum dem Objekt, SNum, den Wert des Iterators zuzuweisen.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;set&gt;

using namespace std;

class SNum {
private :
	int num;
public:
	SNum( int num ) { this-&gt;num = num ;};
	~SNum(){};
	void set_num( int num ){ this-&gt;num = num; };
    int get_num() const  { return num;};
    friend bool operator &lt; (const SNum&amp; a, const SNum&amp; b) {
          if(a.get_num() &lt; b.get_num() )
             return true;
          else
             return false;
       }
};

int main() {

	set&lt;SNum&gt; sN;
	set&lt;SNum&gt;::iterator sN_it;
	SNum* s = 0;

	sN.insert(SNum(2));
	sN.insert(SNum(1));

	for ( sN_it = sN.begin(); sN_it != sN.end(); ++ sN_it ) {
		cout &lt;&lt; sN_it-&gt;get_num()&lt;&lt;endl;
		[b]*s = *sN_it;  [/b]                 &lt;-- hier Absturz
		cout &lt;&lt; s-&gt;get_num()&lt;&lt;endl;
	}
	return 0;
}
</code></pre>
<p>vielen Dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/301984/pointer-und-set-iterator</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 15:15:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301984.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 08 Apr 2012 19:51:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer und Set-Iterator on Sun, 08 Apr 2012 19:51:17 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte ein Objekt aus einem Iterator einem Pointer auf eine Klasse zuweisen.<br />
Bei folgendem Bsp. s.u. stürzt die exe ab.<br />
Ich habe schon länger rumprobiert, es geht darum dem Objekt, SNum, den Wert des Iterators zuzuweisen.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;set&gt;

using namespace std;

class SNum {
private :
	int num;
public:
	SNum( int num ) { this-&gt;num = num ;};
	~SNum(){};
	void set_num( int num ){ this-&gt;num = num; };
    int get_num() const  { return num;};
    friend bool operator &lt; (const SNum&amp; a, const SNum&amp; b) {
          if(a.get_num() &lt; b.get_num() )
             return true;
          else
             return false;
       }
};

int main() {

	set&lt;SNum&gt; sN;
	set&lt;SNum&gt;::iterator sN_it;
	SNum* s = 0;

	sN.insert(SNum(2));
	sN.insert(SNum(1));

	for ( sN_it = sN.begin(); sN_it != sN.end(); ++ sN_it ) {
		cout &lt;&lt; sN_it-&gt;get_num()&lt;&lt;endl;
		[b]*s = *sN_it;  [/b]                 &lt;-- hier Absturz
		cout &lt;&lt; s-&gt;get_num()&lt;&lt;endl;
	}
	return 0;
}
</code></pre>
<p>vielen Dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2200029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200029</guid><dc:creator><![CDATA[*lt*---*gt*]]></dc:creator><pubDate>Sun, 08 Apr 2012 19:51:17 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Set-Iterator on Sun, 08 Apr 2012 20:38:20 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>wenn ich mich nicht irre sind laut Standard Modifikationen über den Iterator eines std:set nicht erlaubt, weswegen der Dereferenzierungsoperator eine konstante Referenz zurückliefert.</p>
<pre><code class="language-cpp">const SNum* s = 0
</code></pre>
<p>und</p>
<pre><code class="language-cpp">s = &amp;*sN_it;
</code></pre>
<p>oder am Besten gleich Referenzen benutzen:</p>
<pre><code class="language-cpp">const SNum&amp; s = *sN_it;
        cout &lt;&lt; s.get_num()&lt;&lt;endl;
</code></pre>
<p>Gruß,<br />
XSpille</p>
<p>EDIT: Deine Version crashed übrigens, weil du einen Zeiger auf 0 dereferenzierst und der Zuweisungsoperator dann auf einem ungültigen Speicherbereich arbeitet.</p>
<p>EDIT2: Zur Verdeutlichung:</p>
<pre><code class="language-cpp">void operator=(const SNum&amp; o){
		cout &lt;&lt; &quot;= &quot; &lt;&lt; this &lt;&lt; endl;
		this-&gt;num = o.num;
	}
</code></pre>
<p>Speicheradresse 0 gehört sicherlich nicht zu deinem erlaubten Speicherbereich <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/2200034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200034</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 08 Apr 2012 20:38:20 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Set-Iterator on Sun, 08 Apr 2012 21:08:40 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>vielen Dank. Dein Bsp. habe ich verstanden (hoffe ich).<br />
Das eigentliche Problem ist folgendes:<br />
Wie erhalte ich eine gültigen Zeiger zurück?<br />
s.u. bei beiden Funktionen wird der Zeiger als ungültig (zeigt irgendwo hin) zurückgeliefert.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;set&gt;

using namespace std;

class SNum {
private :
	int num;
public:
	SNum( int num ) { this-&gt;num = num ;};
	~SNum(){};
	void set_num( int num ){ this-&gt;num = num; };
    int get_num() const  { return num;};
    friend bool operator &lt; (const SNum&amp; a, const SNum&amp; b) {
          if(a.get_num() &lt; b.get_num() )
             return true;
          else
             return false;
       }
};

void getSNum( const SNum * sn, const set&lt;SNum&gt; sN, int num){
	set&lt;SNum&gt;::iterator sN_it = sN.find(SNum(num));
	if ( sN_it != sN.end() )
		sn = &amp;*sN_it;
}

const SNum * getSNum2( const set&lt;SNum&gt; sN, int num){
	set&lt;SNum&gt;::iterator sN_it = sN.find(SNum(num));
	if ( sN_it != sN.end() )
		return &amp;*sN_it;
	return 0;
}
int main() {

	set&lt;SNum&gt; sN;
	set&lt;SNum&gt;::iterator sN_it;
	const SNum* s = 0;

	sN.insert(SNum(2));
	sN.insert(SNum(1));

	s = getSNum2( sN, 2 );
	if (s != 0 ) cout &lt;&lt; s-&gt;get_num() &lt;&lt; endl;

	getSNum( s, sN, 2 );

	if (s != 0 ) cout &lt;&lt; s-&gt;get_num() &lt;&lt; endl;

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2200040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200040</guid><dc:creator><![CDATA[*lt*---*gt*]]></dc:creator><pubDate>Sun, 08 Apr 2012 21:08:40 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Set-Iterator on Sun, 08 Apr 2012 23:00:09 GMT]]></title><description><![CDATA[<p>Woraus folgerst du, dass dein Zeiger ungültig ist?<br />
Also getSNum2 scheint bei mir zu funktionieren und ich sehe gerade auch keinen Grund, warum es nicht funktionieren sollte.<br />
Diese Variante ist auch, welche ich dir empfehlen würde.</p>
<p>Aber trotzdem noch die Erläuterung, warum getSNum nicht funktioniert.<br />
Du übergibst einen Zeiger. Dabei wird für die Funktion eine Kopie des Zeiger erstellt. In der Funktion arbeitest du dann auf der Kopie dieses Zeigers. Nach Verlassen hast du aber wieder deinen Originalwert. Man könnte einen Zeiger auf einen Zeiger übergeben. Etwa so:</p>
<pre><code class="language-cpp">getSNum( &amp;s, sN, 1 );
</code></pre>
<p>und</p>
<pre><code class="language-cpp">void getSNum( const SNum ** sn, const set&lt;SNum&gt; sN, int num){ 
    set&lt;SNum&gt;::iterator sN_it = sN.find(SNum(num)); 
    if ( sN_it != sN.end() ) 
        *sn = &amp;*sN_it; 
}
</code></pre>
<p>Aber wie erwähnt, ist der Rückgabewert aus der ersten Version (meiner Meinung nach) stilistisch schöner.</p>
<p>Gruß,<br />
XSpille</p>
<p>EDIT: btw: Benutz C++-Tags statt Code-Tags <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/2200061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200061</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 08 Apr 2012 23:00:09 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Set-Iterator on Mon, 09 Apr 2012 08:28:26 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke für die Antwort.<br />
getSNum2 funktioniert leider nicht bei mir. Innerhalb der Funktion ist der Wert für s richtig, der Rückgabewert hat aber ungültige Zahlen z.B.-17891602.<br />
Auch habe ich getSNum umgestellt, wie von Dir beschrieben, der Wert von s ist innerhalb der Funktion gültig ausserhalb -17891602.</p>
<pre><code class="language-cpp">void getSNum( const SNum ** sn, const set&lt;SNum&gt; sN, int num)
{
	set&lt;SNum&gt;::iterator sN_it = sN.find(SNum(num));
	if ( sN_it != sN.end() )
		*sn = &amp;*sN_it;
}
</code></pre>
<p>Man sieht die falschen Werte in der Ausgabe von s.</p>
<pre><code class="language-cpp">int main() {

	set&lt;SNum&gt; sN;
	set&lt;SNum&gt;::iterator sN_it;
	const SNum* s = 0;
	SNum* s2 = 0;
	sN.insert(SNum(2));
	sN.insert(SNum(1));

	s = getSNum2( sN, 2 );
	if (s != 0 ) cout &lt;&lt; s-&gt;get_num() &lt;&lt; endl;

	getSNum( &amp;s, sN, 2 );

	if (s != 0 ) cout &lt;&lt; s-&gt;get_num() &lt;&lt; endl;

	for ( sN_it = sN.begin(); sN_it != sN.end(); ++ sN_it ) {
		cout &lt;&lt; sN_it-&gt;get_num()&lt;&lt;endl;
		s = &amp;*sN_it;

		cout &lt;&lt; s-&gt;get_num()&lt;&lt;endl;

	}
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2200084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200084</guid><dc:creator><![CDATA[*lt*---*gt*]]></dc:creator><pubDate>Mon, 09 Apr 2012 08:28:26 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Set-Iterator on Mon, 09 Apr 2012 11:49:17 GMT]]></title><description><![CDATA[<p>Ich war wohl gestern nicht mehr ganz wach <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Du erstellst auch eine Kopie von deinem set.<br />
Du musst dein set per Referenz (oder Pointer) übergeben.</p>
<pre><code class="language-cpp">const SNum * getSNum2( const set&lt;SNum&gt;&amp; sN, int num);
</code></pre>
<p>Das gleiche gilt auch für die Funktion, die ich gepostet habe.<br />
Hab ich völlig übersehen, dass da kein &amp; ist ^^</p>
<p>Ansonsten wird eine Kopie erzeugt und nach dem Funktionsaufruf wieder gelöscht.<br />
Somit verweist der Zeiger auf ein Element eines gelöschten set.</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2200124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200124</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Mon, 09 Apr 2012 11:49:17 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Set-Iterator on Mon, 09 Apr 2012 19:10:27 GMT]]></title><description><![CDATA[<p>Vielen Dank!</p>
<p>läuft jetzt, habe vor lauter rumprobieren, nicht mehr gesehen, dass ich den Wert übergebe.<br />
nochmals Danke, vor allem für die ausführlichen Erklärungen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2200293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200293</guid><dc:creator><![CDATA[*lt*---*gt*]]></dc:creator><pubDate>Mon, 09 Apr 2012 19:10:27 GMT</pubDate></item></channel></rss>