<?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[Seltsames Phänomen bei Zuweisungen in Schleife]]></title><description><![CDATA[<p>Hallo Leute! <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 habe ein - wie ich finde - sehr seltsames Problem.<br />
Ich möchte zur Übung eine Klasse 'Fraction' schreiben, die einen Dezimalbruch darstellt und entsprechende Rechenoperationen bietet. Das ist mir im Grunde auch gelungen, aber bei deren Verwendung ergibt sich folgende Schwierigkeit:</p>
<p>Dieser Code</p>
<pre><code class="language-cpp">Fraction* f[2];
	string s;
	cin &gt;&gt; s;
	try{ 
		f[0] = &amp;Fraction::parseFraction(s); //interpretiert den String und erzeugt ein Fraction-Objekt
	} catch (exception&amp; ex) {
		cout &lt;&lt; &quot;An error ocurred: &quot; &lt;&lt; ex.what() &lt;&lt; endl;
	}
	cin &gt;&gt; s;
	try{ 
		f[1] = &amp;Fraction::parseFraction(s);
	} catch (exception&amp; ex) {
		cout &lt;&lt; &quot;An error ocurred: &quot; &lt;&lt; ex.what() &lt;&lt; endl;
	}
</code></pre>
<p>liest nacheinander zwei strings aus der Konsole ein und konvertiert sie jeweils in einen Bruch (Fraction-Objekt) und funktioniert prächtig.</p>
<p>Dieser Code</p>
<pre><code class="language-cpp">Fraction* f[2];
	int i=0;
	while(i&lt;2){
		string s;
		cin &gt;&gt; s;
		try{ 
			f[i] = &amp;Fraction::parseFraction(s);
			i++;
		} catch (exception&amp; ex) {
			cout &lt;&lt; &quot;An error ocurred: &quot; &lt;&lt; ex.what() &lt;&lt; endl;
		}
	}
</code></pre>
<p>sollte meines Wissens nach genau dasselbe tun, liefert aber im Gegensatz zum obigen das Resultat, dass am Ende 'f[0]' und 'f[1]' identisch sind und dem zweiten eingegebenen Bruch entsprechen.</p>
<p>Kann mir das irgendwer erklären? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Ich bin absolut ratlos und für jede Hilfe dankbar!</p>
<p>Grüße<br />
SuperSeppel13</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/299774/seltsames-phänomen-bei-zuweisungen-in-schleife</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 03:12:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/299774.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Feb 2012 02:07:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Seltsames Phänomen bei Zuweisungen in Schleife on Sat, 18 Feb 2012 02:07:46 GMT]]></title><description><![CDATA[<p>Hallo Leute! <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 habe ein - wie ich finde - sehr seltsames Problem.<br />
Ich möchte zur Übung eine Klasse 'Fraction' schreiben, die einen Dezimalbruch darstellt und entsprechende Rechenoperationen bietet. Das ist mir im Grunde auch gelungen, aber bei deren Verwendung ergibt sich folgende Schwierigkeit:</p>
<p>Dieser Code</p>
<pre><code class="language-cpp">Fraction* f[2];
	string s;
	cin &gt;&gt; s;
	try{ 
		f[0] = &amp;Fraction::parseFraction(s); //interpretiert den String und erzeugt ein Fraction-Objekt
	} catch (exception&amp; ex) {
		cout &lt;&lt; &quot;An error ocurred: &quot; &lt;&lt; ex.what() &lt;&lt; endl;
	}
	cin &gt;&gt; s;
	try{ 
		f[1] = &amp;Fraction::parseFraction(s);
	} catch (exception&amp; ex) {
		cout &lt;&lt; &quot;An error ocurred: &quot; &lt;&lt; ex.what() &lt;&lt; endl;
	}
</code></pre>
<p>liest nacheinander zwei strings aus der Konsole ein und konvertiert sie jeweils in einen Bruch (Fraction-Objekt) und funktioniert prächtig.</p>
<p>Dieser Code</p>
<pre><code class="language-cpp">Fraction* f[2];
	int i=0;
	while(i&lt;2){
		string s;
		cin &gt;&gt; s;
		try{ 
			f[i] = &amp;Fraction::parseFraction(s);
			i++;
		} catch (exception&amp; ex) {
			cout &lt;&lt; &quot;An error ocurred: &quot; &lt;&lt; ex.what() &lt;&lt; endl;
		}
	}
</code></pre>
<p>sollte meines Wissens nach genau dasselbe tun, liefert aber im Gegensatz zum obigen das Resultat, dass am Ende 'f[0]' und 'f[1]' identisch sind und dem zweiten eingegebenen Bruch entsprechen.</p>
<p>Kann mir das irgendwer erklären? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Ich bin absolut ratlos und für jede Hilfe dankbar!</p>
<p>Grüße<br />
SuperSeppel13</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2182542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2182542</guid><dc:creator><![CDATA[SuperSeppel13]]></dc:creator><pubDate>Sat, 18 Feb 2012 02:07:46 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames Phänomen bei Zuweisungen in Schleife on Sat, 18 Feb 2012 02:35:50 GMT]]></title><description><![CDATA[<p>Warum erstellst du denn ein Array aus zwei Zeigern auf Fraction anstatt ein Array aus zwei Fraction? Du speicherst hier die Adresse eine temporären Objekts, das kann ja nicht klappen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2182544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2182544</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 18 Feb 2012 02:35:50 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames Phänomen bei Zuweisungen in Schleife on Sat, 18 Feb 2012 02:58:43 GMT]]></title><description><![CDATA[<p>Also die Variante wie du sie geschildert hast, würde in der parseFraction Methode zum Schluss ein &quot;return *(new Fraction(...))&quot; stehen und das ist extrem hässlich und würde niemand so machen!</p>
<p>Du brauchst die Funktion so:</p>
<pre><code class="language-cpp">// Fraction.h
static Fraction Fraction::parseFraction(...)
{
    // ...
    return Fraction(nom, denom);
}

//main.cpp
Fraction fraction[2] = { Fraction::parseFraction(cin.readline()), Fraction::parseFraction(cin.readline()) }; // stimmt das cin.readline()?
</code></pre>
<p>So bekommst du eine volle Kopie des Fraction. Du hast nur einem Pointer auf ein bereits wieder zerstörtes Objekt bekommen. Dadurch, dass die Daten nur wieder freigegeben werden (nicht überschrieben) erschien es dir, dass du mit den Objekten arbeitest, aber eigentlich solltest du eine Fehlermeldung bekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2182547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2182547</guid><dc:creator><![CDATA[PhilippHToner]]></dc:creator><pubDate>Sat, 18 Feb 2012 02:58:43 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames Phänomen bei Zuweisungen in Schleife on Sat, 18 Feb 2012 04:00:45 GMT]]></title><description><![CDATA[<p>Danke erstmal für die schnelle Antwort!<br />
Meine parseFraction-Methode sieht so aus:</p>
<pre><code class="language-cpp">Fraction Fraction::parseFraction(string s) throw (exception) {
	stringstream ss(s);
	int num_, denom_;
	char c;
	bool error = false;

	error |= (ss&gt;&gt;num_).fail();// &lt;-- hier werden die zwei zahlen eingelesen...
	ss&gt;&gt;c;
	error |= c != '/';
	error |= (ss&gt;&gt;denom_).fail();// &lt;--

	if(error){
		throw exception((&quot;Invalid input: &quot; + s).c_str());
	}else{
		return Fraction(num_, denom_);//...und hier dann das Fraction-Objekt erzeugt
	}
}
</code></pre>
<p>Also eigentlich war das schon so, wie du vorgeschlagen hast.<br />
Und 'cin.readline()' gibt's in meiner welt nicht (?), aber das einlesen der strings ist auch nicht das problem.</p>
<p>Ich hätte halt vor allem gedacht, dass die beiden Code-Beispiele, die ich gepostet hab, exakt gleichwertig sind und ich kann mir nicht erklären, warum das eine funktioniert und das andere nicht.<br />
Irgendeine Idee dazu...?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2182550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2182550</guid><dc:creator><![CDATA[SuperSeppel13]]></dc:creator><pubDate>Sat, 18 Feb 2012 04:00:45 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames Phänomen bei Zuweisungen in Schleife on Sat, 18 Feb 2012 04:03:01 GMT]]></title><description><![CDATA[<p>SuperSeppel13 schrieb:</p>
<blockquote>
<p>Irgendeine Idee dazu...?</p>
</blockquote>
<p>Liest eigentlich niemand meine Beiträge? Dann kann ich sie mir ja auch sparen. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2182551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2182551</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 18 Feb 2012 04:03:01 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames Phänomen bei Zuweisungen in Schleife on Sat, 18 Feb 2012 04:15:24 GMT]]></title><description><![CDATA[<p>Ah, den hab ich total übersehen - tut mir voll Leid <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title="=/"
      alt="😕"
    /></p>
<p>Ja, so klappt's. Ich hatte das zuerst nicht so bemacht, weil Fraction keinen parameterlosen Konstruktor hatte und deswegen die Initialisierung des Array nicht funktioniert hat.</p>
<p>Also erstmal vielen 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>
<p>Ganz so klar ist mir allerdings nicht, warum das vorher bei der einen Version funktioniert hat und bei der anderen nicht.<br />
Ist da das erste Objekt direkt wieder zerstört worden und dann das andere einfach an derselben stelle im Speicher gelandet? Aber warum dann nur bei der Version mit Schleife?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2182552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2182552</guid><dc:creator><![CDATA[SuperSeppel13]]></dc:creator><pubDate>Sat, 18 Feb 2012 04:15:24 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames Phänomen bei Zuweisungen in Schleife on Sat, 18 Feb 2012 05:08:36 GMT]]></title><description><![CDATA[<p>SuperSeppel13 schrieb:</p>
<blockquote>
<p>Ich hatte das zuerst nicht so bemacht, weil Fraction keinen parameterlosen Konstruktor hatte und deswegen die Initialisierung des Array nicht funktioniert hat.</p>
</blockquote>
<p>Falls du das Problem noch mal hast, nutze new zusammen mit std::unique_ptr. (C++11) Der gibt den Speicher automatisch wieder frei und ist dank Destruktor auch Exception-sicher. (Falls dir dynamische Speicherverwaltung noch nicht geläufig ist, pass auf das du das Problem gar nicht erst bekommst. :p)</p>
<p>SuperSeppel13 schrieb:</p>
<blockquote>
<p>Ganz so klar ist mir allerdings nicht, warum das vorher bei der einen Version funktioniert hat und bei der anderen nicht.<br />
Ist da das erste Objekt direkt wieder zerstört worden und dann das andere einfach an derselben stelle im Speicher gelandet? Aber warum dann nur bei der Version mit Schleife?!</p>
</blockquote>
<p>Beide Versionen hatten undefiniertes Verhalten, dass überhaupt etwas Sinnvolles herumgekommen ist, war nur Zufall.<br />
Wird eine Funktion mit Rückgabewert aufgerufen, liefert diese ein temporäres Objekt zurück. Das wird am Ende des Ausdrucks aber sofort wieder ungültig, seine Adresse zu speichern und nachher wieder zu verwenden ist also keine gute Idee.</p>
<pre><code class="language-cpp">create_foo(); // Erstellt temporäres foo
foo foo1 = create_foo(); // Ok, Objekt wird kopiert
some_function(create_foo()); // Ok, Objekt wird kopiert
some_function(&amp;create_foo()); // Ok, Objekt existiert während des Funktionsaufrufs.
foo const* foo2 = &amp;create_foo(); // &quot;Ok&quot;, aber pass auf
foo2-&gt;whatever(); // Autsch! Das Objekt auf das der Pointer zeigt existiert nicht mehr!
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2182553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2182553</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 18 Feb 2012 05:08:36 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames Phänomen bei Zuweisungen in Schleife on Sat, 18 Feb 2012 04:35:57 GMT]]></title><description><![CDATA[<p>Wunderbar! Wieder was gelernt. <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 />
Den unique_ptr schau ich mir auch mal an...</p>
<p>Nochmal ein großes Dankeschön!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2182555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2182555</guid><dc:creator><![CDATA[SuperSeppel13]]></dc:creator><pubDate>Sat, 18 Feb 2012 04:35:57 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsames Phänomen bei Zuweisungen in Schleife on Sat, 18 Feb 2012 05:04:49 GMT]]></title><description><![CDATA[<p>Wobei du bei solchen Sachen aufpassen solltest. Ist etwas verzwickt wie mir scheint: <a href="http://accu.org/index.php/journals/227" rel="nofollow">http://accu.org/index.php/journals/227</a><br />
(Betrifft insbesondere:)</p>
<pre><code class="language-cpp">some_function(&amp;create_foo());
foo* foo2 = &amp;create_foo();
</code></pre>
<p>Das würde mit Built-In Typen nicht funktionieren, und scheint mir daher irgendwie inkonsistent. Es kompiliert allerdings: <a href="http://ideone.com/QbPrI" rel="nofollow">http://ideone.com/QbPrI</a><br />
Unter VS10 mit</p>
<blockquote>
<p>warning C4238: nonstandard extension used : class rvalue used as lvalue</p>
</blockquote>
<p>Ich weiß aber gerade nicht, ob diese Warnung so noch aktuell ist.</p>
<p>Am besten du lässt den Adressoperator von temporären Objekten, das macht eh in den seltensten Fällen Sinn. <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/2182557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2182557</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 18 Feb 2012 05:04:49 GMT</pubDate></item></channel></rss>