<?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[Rückgabeproblem mit Enum]]></title><description><![CDATA[<p>Hi, wieso funktioniert denn in der GetMyEnum-Funktion die Return-Zeile und die |= Operation nicht?</p>
<pre><code>enum MyEnum
{
	First,
	Second,
	Last
};

MyEnum GetMyEnum(bool flag)
{
	MyEnum myEnum = MyEnum::First;
	if (flag)
	{
		myEnum |= MyEnum::Second;
	}
	else
	{
		return myEnum;
	}
	return (myEnum | MyEnum::Last);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/291641/rückgabeproblem-mit-enum</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 14:47:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/291641.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 23 Aug 2011 16:33:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rückgabeproblem mit Enum on Tue, 23 Aug 2011 16:33:38 GMT]]></title><description><![CDATA[<p>Hi, wieso funktioniert denn in der GetMyEnum-Funktion die Return-Zeile und die |= Operation nicht?</p>
<pre><code>enum MyEnum
{
	First,
	Second,
	Last
};

MyEnum GetMyEnum(bool flag)
{
	MyEnum myEnum = MyEnum::First;
	if (flag)
	{
		myEnum |= MyEnum::Second;
	}
	else
	{
		return myEnum;
	}
	return (myEnum | MyEnum::Last);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2109743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109743</guid><dc:creator><![CDATA[Enumerator]]></dc:creator><pubDate>Tue, 23 Aug 2011 16:33:38 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabeproblem mit Enum on Tue, 23 Aug 2011 17:34:59 GMT]]></title><description><![CDATA[<p>Ein Integer kann nicht implizit in eine Enumator konvertiert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109758</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Tue, 23 Aug 2011 17:34:59 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabeproblem mit Enum on Tue, 23 Aug 2011 17:49:53 GMT]]></title><description><![CDATA[<p>Ist folgender Code eine gute Lösung oder eher nicht?</p>
<pre><code>enum MyEnum
{
    First,
    Second,
    Last
};

MyEnum GetMyEnum(bool flag)
{
    int myEnum = MyEnum::First;
    if (flag)
    {
        myEnum |= MyEnum::Second;
    }
    else
    {
        return static_cast&lt;MyEnum&gt;(myEnum);
    }
    return static_cast&lt;MyEnum&gt;(myEnum | MyEnum::Last);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2109766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109766</guid><dc:creator><![CDATA[Enumerator]]></dc:creator><pubDate>Tue, 23 Aug 2011 17:49:53 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabeproblem mit Enum on Tue, 23 Aug 2011 17:57:14 GMT]]></title><description><![CDATA[<p>Mir würde es Bauchschmerzen bereiten. Weil jetzt der Rückgabetyp eine Wertemenge von drei Werten verspricht, Du aber sechs Werte in den Typ presst. Wer darüber switcht, wägt sich in falscher Sicherheit.<br />
Du solltest mit einem int offen erklären &quot;Hier stehe ich und rechne.&quot; Dann ist das auch ok.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109768</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 23 Aug 2011 17:57:14 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabeproblem mit Enum on Tue, 23 Aug 2011 19:16:33 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Mir würde es Bauchschmerzen bereiten. Weil jetzt der Rückgabetyp eine Wertemenge von drei Werten verspricht, Du aber sechs Werte in den Typ presst. Wer darüber switcht, wägt sich in falscher Sicherheit.<br />
Du solltest mit einem int offen erklären &quot;Hier stehe ich und rechne.&quot; Dann ist das auch ok.</p>
</blockquote>
<p>In Fällen wie diesen, wo man es eher mit einer low-level-Variante eines Sets zu tun hat, ist int keine offensichtlich bessere Wahl. Es ist ja nicht so, als ob tatsächlich richtige Arithmetik damit betrieben würde. Man sollte evtl. über Operatorüberladung nachdenken.</p>
<pre><code class="language-cpp">constexpr MyEnum operator|(MyEnum lhs, MyEnum rhs) { return MyEnum( (unsigned)lhs | rhs ); }
MyEnum&amp; operator|=(MyEnum&amp; lhs, MyEnum rhs) { return lhs = lhs | rhs; }
// .. analog für &amp; und ^
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2109792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109792</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 23 Aug 2011 19:16:33 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabeproblem mit Enum on Tue, 23 Aug 2011 21:50:43 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Mir würde es Bauchschmerzen bereiten. Weil jetzt der Rückgabetyp eine Wertemenge von drei Werten verspricht, Du aber sechs Werte in den Typ presst. Wer darüber switcht, wägt sich in falscher Sicherheit.<br />
Du solltest mit einem int offen erklären &quot;Hier stehe ich und rechne.&quot; Dann ist das auch ok.</p>
</blockquote>
<p>Ok, ich fürchte mein geposteter Code war schwachsinn. Vielleicht sollte ich doch den ganzen Code posten. Die Funktion/Enum schaut so aus:</p>
<pre><code>enum MyEnum
	{
		First = 1,
		Second = 2,
		Third = 0,
		Forth = 4,
		Fifth = 8
	};

MyEnum GetMyEnum()
{
	int myEnum = MyEnum::Third;
	if (Bedingung1)
	{
		myEnum |= MyEnum::First;
	}
	if (Bedingung2)
	{
		myEnum |= MyEnum::Second;
	}
	if (Bedingung3)
	{
		return static_cast&lt;MyEnum&gt;(myEnum);
	}
	return static_cast&lt;MyEnum&gt;(myEnum | MyEnum::Forth);
}
</code></pre>
<p>Macht der Code so immer noch Bauchschmerzen? Und kann mir mal jemand erklären was eigentlich diese |= Operation genau macht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109861</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109861</guid><dc:creator><![CDATA[Enumerator]]></dc:creator><pubDate>Tue, 23 Aug 2011 21:50:43 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabeproblem mit Enum on Tue, 23 Aug 2011 22:02:00 GMT]]></title><description><![CDATA[<p>Enumerator schrieb:</p>
<blockquote>
<p>Macht der Code so immer noch Bauchschmerzen?</p>
</blockquote>
<p>Die Werte-Verteilung in dem enum sieht auf jeden Fall sonderbar aus (besonders &quot;Third=0&quot;)</p>
<blockquote>
<p>Und kann mir mal jemand erklären was eigentlich diese |= Operation genau macht?</p>
</blockquote>
<p>Der operator | liefert eine bitweise ODER-Verknüpfung der beteiligten Werte, |= ist der dazugehörige kombinierte Zuweisungsoperator ( <code>a|=b</code> ist äquivalent zu <code>a=a|b</code> ).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109866</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 23 Aug 2011 22:02:00 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabeproblem mit Enum on Tue, 23 Aug 2011 23:04:08 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Weil jetzt der Rückgabetyp eine Wertemenge von drei Werten verspricht, Du aber sechs Werte in den Typ presst.</p>
</blockquote>
<p>Ich verstehe die Aussage von volkard bzw. die Funktion der Funktion noch nicht so ganz. Kann der Rückgabewert also mehrere Werte gleichzeitig haben? Also mal angenommen die Bedingung1 ist wahr die anderen beiden falsch. Wäre im Rückgabetyp dann sowohl MyEnum::Third, MyEnum::First und MyEnum::Forth codiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109889</guid><dc:creator><![CDATA[Enumerator]]></dc:creator><pubDate>Tue, 23 Aug 2011 23:04:08 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabeproblem mit Enum on Wed, 24 Aug 2011 05:28:28 GMT]]></title><description><![CDATA[<p>Enumerator schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Weil jetzt der Rückgabetyp eine Wertemenge von drei Werten verspricht, Du aber sechs Werte in den Typ presst.</p>
</blockquote>
<p>Ich verstehe die Aussage von volkard bzw. die Funktion der Funktion noch nicht so ganz. Kann der Rückgabewert also mehrere Werte gleichzeitig haben? Also mal angenommen die Bedingung1 ist wahr die anderen beiden falsch. Wäre im Rückgabetyp dann sowohl MyEnum::Third, MyEnum::First und MyEnum::Forth codiert?</p>
</blockquote>
<p>Der Rückgabewert kann nur einen Wert annehmen, Du &quot;veroderst&quot; aber mehrere Werte in ihm, und das ist durch den definierten Typ gar nicht abgedeckt. Zum Beispiel baust Du aus &quot;Forth | Fifth&quot; arithmetisch den Wert 12, der aber in dem Enum gar nicht existiert. Du castest jetzt also 12 in den Enum - und das ist ganz einfach nicht korrekt.</p>
<p>Gruss, Knuttertron</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109928</guid><dc:creator><![CDATA[knuttertron]]></dc:creator><pubDate>Wed, 24 Aug 2011 05:28:28 GMT</pubDate></item></channel></rss>