<?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-Attribute ändern sich]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin Umsteiger nach C++ (von C#) und wollte mich nun mal dran probieren eine verkettete Liste zu schreiben. Die Klasse List hat das Attribut first, welches vom Typ ListNode* ist. ListNode hat die Attribute next (ebenfalls ListNode*) und value (int) zum Speichern der Inhalte. Nun habe ich mich ans Einfügen von Werten gemacht:</p>
<pre><code class="language-cpp">void List::add(int value)
{
	if(!first)
		first = &amp;ListNode(value);
	else
	{
		ListNode* tmp = first;
		while(tmp-&gt;next != NULL)
			tmp = tmp-&gt;next;
		tmp-&gt;next = &amp;ListNode(value);
	}
}
</code></pre>
<p>'first' wird absolut richtig belegt.<br />
Wenn ich jetzt aber noch ein Element hinzufügen will (sprich das Programm springt in den else-Zweig mit der Schleife), hat first plötzlich einen anderen Wert bei 'value', und 'next' ist 0xcccccccc. Per Google hab ich schon herausgefunden, dass es öfters mal Probleme damit gibt, eine Lösung aber nicht.</p>
<p>Woran liegt es also nun, dass first sich ändert? Sollte man für Attribute überhaupt Pointer verwenden (in C# sind Klassen ja automatisch Referenztypen, man braucht sowas also nicht)?</p>
<p>MfG<br />
Random123</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/302946/objekt-attribute-ändern-sich</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 00:01:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302946.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 May 2012 15:34:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekt-Attribute ändern sich on Tue, 01 May 2012 15:34:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin Umsteiger nach C++ (von C#) und wollte mich nun mal dran probieren eine verkettete Liste zu schreiben. Die Klasse List hat das Attribut first, welches vom Typ ListNode* ist. ListNode hat die Attribute next (ebenfalls ListNode*) und value (int) zum Speichern der Inhalte. Nun habe ich mich ans Einfügen von Werten gemacht:</p>
<pre><code class="language-cpp">void List::add(int value)
{
	if(!first)
		first = &amp;ListNode(value);
	else
	{
		ListNode* tmp = first;
		while(tmp-&gt;next != NULL)
			tmp = tmp-&gt;next;
		tmp-&gt;next = &amp;ListNode(value);
	}
}
</code></pre>
<p>'first' wird absolut richtig belegt.<br />
Wenn ich jetzt aber noch ein Element hinzufügen will (sprich das Programm springt in den else-Zweig mit der Schleife), hat first plötzlich einen anderen Wert bei 'value', und 'next' ist 0xcccccccc. Per Google hab ich schon herausgefunden, dass es öfters mal Probleme damit gibt, eine Lösung aber nicht.</p>
<p>Woran liegt es also nun, dass first sich ändert? Sollte man für Attribute überhaupt Pointer verwenden (in C# sind Klassen ja automatisch Referenztypen, man braucht sowas also nicht)?</p>
<p>MfG<br />
Random123</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207264</guid><dc:creator><![CDATA[Random123]]></dc:creator><pubDate>Tue, 01 May 2012 15:34:48 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt-Attribute ändern sich on Tue, 01 May 2012 15:57:43 GMT]]></title><description><![CDATA[<p>Random123 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">first = &amp;ListNode(value);
</code></pre>
<p>'first' wird absolut richtig belegt.</p>
</blockquote>
<p>Autsch. Leider nein. Du erzeugst ein temporäres Objekt, dessen Adresse du in first ablegst, danach wird das Objekt zerstört und du has einen dangling pointer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207270</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Tue, 01 May 2012 15:57:43 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt-Attribute ändern sich on Tue, 01 May 2012 16:02:13 GMT]]></title><description><![CDATA[<p>Das wäre auch in C++ ein Fall für new. Am besten zusammen mit unique_ptr, aber zum üben geht's auch ohne. (Man würde ja eh std::list nutzen in echtem Code.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207272</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 01 May 2012 16:02:13 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt-Attribute ändern sich on Tue, 01 May 2012 16:33:40 GMT]]></title><description><![CDATA[<p>Random123 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">first = &amp;ListNode(value);
</code></pre>
</blockquote>
<p>Das ist kein Standard-C++. Das sage ich unter der Annahme, dass Du den Adressoperator nicht für die Klasse überladen hast. ListNode(value) erzeugt nämlich ein temporäres Objekt was mit dem Semikolon wieder verschwindet. Dass das hier mit dem Adressoperator überhaupt funktioniert hast Du Microsoft zu verdanken; denn die hielten das für eine voll dufte Idee, dass man sich die Adresse eines temporären Objekt holen kann. Sie bieten das als &quot;Erweiterung&quot; an, eine Erweiterung die eher sinnfrei und gefährlich ist. Man kann diesen Schmarn auch abschalten. Allerdings weiß ich nicht, ob dann auch all die anderen viel nützlicheren C++11-Features deaktiviert werden. Ich habe nicht so viel Erfahrung mit diesem Compiler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207286</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 01 May 2012 16:33:40 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt-Attribute ändern sich on Wed, 02 May 2012 13:07:41 GMT]]></title><description><![CDATA[<p>Hallo und vielen Dank!</p>
<p>So funktioniert es nun:</p>
<pre><code class="language-cpp">void List::add(int value)
{
	if(!first)
		first = new ListNode(value);
	else
	{
		ListNode* tmp = first;
		while(tmp-&gt;next != NULL)
			tmp = tmp-&gt;next;
		tmp-&gt;next = new ListNode(value);
	}
}
</code></pre>
<p>Nun habe ich noch eine weitere Frage, und zwar folgende: Wenn ich einem ListNode beim erstellen gleich seinen Nachfolger mitgeben will (per Konstruktor), sollte ich dann nur das Objekt, einen Pointer drauf oder eine Referenz übergeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207578</guid><dc:creator><![CDATA[Random123]]></dc:creator><pubDate>Wed, 02 May 2012 13:07:41 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt-Attribute ändern sich on Wed, 02 May 2012 13:22:08 GMT]]></title><description><![CDATA[<p>Du musst die Knoten übrigens im Destruktor auch löschen, nur falls du das nicht weißt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207581</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 02 May 2012 13:22:08 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt-Attribute ändern sich on Wed, 02 May 2012 13:30:28 GMT]]></title><description><![CDATA[<p>Random123 schrieb:</p>
<blockquote>
<p>Nun habe ich noch eine weitere Frage, und zwar folgende: Wenn ich einem ListNode beim erstellen gleich seinen Nachfolger mitgeben will (per Konstruktor), sollte ich dann nur das Objekt, einen Pointer drauf oder eine Referenz übergeben?</p>
</blockquote>
<p>Also</p>
<ol>
<li>Das Objekt übergeben geht schonmal nicht. Du kannst als Funktionsparameter nur Pointer, Referenzen oder aber Kopien übergeben. Nie das Objekt selber. Am nächsten käme da eine Referenz heran.</li>
<li>Eine Referenz ginge, da allerdings erstens der Nachfolger im Knoten per Pointer gehalten wird und zweitens es nicht unbedingt einen Nachfolger geben muss, würde ich am ehesen zu 3) tendieren:</li>
<li>Per Pointer. Damit kannst du sowohl den Fall &quot;hat einen nachfolger&quot; als auch &quot;hat keinen Nachfolger&quot; erschlagen:</li>
</ol>
<pre><code class="language-cpp">ListNode::ListNode(int value, ListNode* nex = NULL);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2207588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207588</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 02 May 2012 13:30:28 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt-Attribute ändern sich on Wed, 02 May 2012 13:46:53 GMT]]></title><description><![CDATA[<p>Danke pumuckl, dann mach ich es mit einem Pointer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207595</guid><dc:creator><![CDATA[Random123]]></dc:creator><pubDate>Wed, 02 May 2012 13:46:53 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt-Attribute ändern sich on Thu, 03 May 2012 17:20:30 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab nochmal eine Frage beim entfernen (folgender Code funktioniert, hat aber keine delete):</p>
<pre><code class="language-cpp">int List::removeAt(int index)
{
	int value = 0;
	if(index == 0)
	{
		value = first-&gt;value;
		first = first-&gt;next;
	}
	else
	{
		ListNode* pre = first;
		while(index &gt; 1)
		{
			pre = pre-&gt;next;
			index--;
		}
		value = pre-&gt;next-&gt;value;
		pre-&gt;next = pre-&gt;next-&gt;next;
	}

	length--;
	return value;
}
</code></pre>
<p>Ich will ein ListNode, das irgendwo in der Mitte (bzw. auch am Anfang oder Ende) liegt löschen. Sprich: Der Vorgängers des zu löschenden Knoten soll als Nachfolger den Nachfolger des zu löschenden Knotens bekommen, sodass ich den zu löschenden Knoten auch wirklich löschen kann (delete). Wenn ich das tue, wird aber auch dessen Nachfolger entfernt (anscheinend, liege ich damit richtig?). Selbst wenn ich den Pointer auf den Nachfolger des zu löschenden Knotens nicht direkt übernehme, sondern einen neuen erstelle funktioniert das nicht. Wie also macht man das?</p>
<p>Ich hoffe ihr konntet meine Sätze verstehen <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>
<p>MfG Random123</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2208012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2208012</guid><dc:creator><![CDATA[Random123]]></dc:creator><pubDate>Thu, 03 May 2012 17:20:30 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt-Attribute ändern sich on Thu, 03 May 2012 18:03:38 GMT]]></title><description><![CDATA[<p>Random123 schrieb:</p>
<blockquote>
<p>Wenn ich das tue, wird aber auch dessen Nachfolger entfernt (anscheinend, liege ich damit richtig?).</p>
</blockquote>
<p>Wissen wir nicht. Das hängt davon ab, wie du ListNode geschrieben hast. Falls jeder seinen Nachfolger besitzt und im Destruktor zerstört, wirst du vor dem Löschen eines einzelnen Knotens offensichtlich den Zeiger auf den Nachfolger auf 0 setzen müssen.<br />
Übrigens ist es eleganter, über die Zeiger auf den Folgeknoten zu iterieren statt über die Knoten selbst. Auf diese Weise entfällt das Löschen des Anfangs als Spezialfall. Also ungefähr so</p>
<pre><code class="language-cpp">int List::removeAt(int index)
{
    ListNode** link = &amp;first;
    for ( int i = 0; i != index; ++i ) // Halte ich persönlich für leichter lesbar als index zu dekrementieren - wenn du das Ganze auf Papier machst, zählst du ja wahrscheinlich auch nicht rückwärts
    {
        assert( *link != nullptr );
        link = &amp;(*link)-&gt;next;
    }
    ListNode* node = *link;
    assert( node != nullptr );
    *link = node-&gt;next;    // Knoten isolieren
    node-&gt;next = nullptr;  // ggf. notwendig, s.o.
    int value = node-&gt;value;
    delete node;
    --length;
    return value;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2208021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2208021</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 03 May 2012 18:03:38 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt-Attribute ändern sich on Fri, 04 May 2012 16:55:29 GMT]]></title><description><![CDATA[<p>Danke camper,<br />
dein Code funktioniert, und ich glaube ich bin auch dahintergekommen, wie.</p>
<p>In Zeile 11 von deinem Code manipuliere ich einen Pointer, der auch ein Next-Pointer eines Knotens ist (außer index ist 0). Habe ich das richtig verstanden?</p>
<p>Vielen Dank,<br />
Random123</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2208335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2208335</guid><dc:creator><![CDATA[Random123]]></dc:creator><pubDate>Fri, 04 May 2012 16:55:29 GMT</pubDate></item></channel></rss>