<?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[&#x2F;&#x2F;wie enum-artige struktur mit operator++]]></title><description><![CDATA[<p>Hallo<br />
In meinem namespace moechte ich richtungspezifische Indizes vergeben. Bisher mache ich dies über const integer Variablen:</p>
<pre><code class="language-cpp">namespace Test
{
  const int E = 0;
  const int N = 1;
  const int W = 2;
  const int S = 3;

  const int START_DIR = 0;
  const int END_DIR   = 3;

  ...
  int getValForDir(const int&amp; dir) { return array[dir]; }
</code></pre>
<p>Hierfür hätte ich lieber einen enum-artigen Typ, so dass ich an</p>
<pre><code class="language-cpp">getValForDir(Dir dir) {...}
</code></pre>
<p>schreiben kann und somit die Grenzen gewahrt sind. Enums kann man aber nicht in for-Schleifen verwenden (kein ++ Operator).<br />
Bisher:</p>
<pre><code class="language-cpp">for(int dir=START_DIR; dir&lt;=END_DIR; dir++) { ... }
</code></pre>
<p>Sponatn würd eich jetzt eine eigene Klasse schreiben, die const ints als Member besitzt un den ++/-- operator überladt. Aber das geht doch sicherlich eleganter, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/227083/wie-enum-artige-struktur-mit-operator</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 16:13:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/227083.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 10 Nov 2008 17:40:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &#x2F;&#x2F;wie enum-artige struktur mit operator++ on Mon, 10 Nov 2008 17:40:47 GMT]]></title><description><![CDATA[<p>Hallo<br />
In meinem namespace moechte ich richtungspezifische Indizes vergeben. Bisher mache ich dies über const integer Variablen:</p>
<pre><code class="language-cpp">namespace Test
{
  const int E = 0;
  const int N = 1;
  const int W = 2;
  const int S = 3;

  const int START_DIR = 0;
  const int END_DIR   = 3;

  ...
  int getValForDir(const int&amp; dir) { return array[dir]; }
</code></pre>
<p>Hierfür hätte ich lieber einen enum-artigen Typ, so dass ich an</p>
<pre><code class="language-cpp">getValForDir(Dir dir) {...}
</code></pre>
<p>schreiben kann und somit die Grenzen gewahrt sind. Enums kann man aber nicht in for-Schleifen verwenden (kein ++ Operator).<br />
Bisher:</p>
<pre><code class="language-cpp">for(int dir=START_DIR; dir&lt;=END_DIR; dir++) { ... }
</code></pre>
<p>Sponatn würd eich jetzt eine eigene Klasse schreiben, die const ints als Member besitzt un den ++/-- operator überladt. Aber das geht doch sicherlich eleganter, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612865</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Mon, 10 Nov 2008 17:40:47 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;wie enum-artige struktur mit operator++ on Mon, 10 Nov 2008 18:19:41 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>was hälst du von dieser Lösung mit enum?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

enum Dir
{
	START_DIR,

	EAST,
	NORTH,
	SOUTH,
	WEST,

	END_DIR
};

std::string getDirStr(const Dir dir);

int main()
{
	for (int i = START_DIR + 1; i &lt; END_DIR; ++i)
	{
		Dir dir = (Dir) i;
		std::cout &lt;&lt; &quot;Int: &quot; &lt;&lt; i &lt;&lt; &quot;, String: &quot; &lt;&lt; getDirStr(dir) &lt;&lt; std::endl;
	}
}

std::string getDirStr(const Dir dir)
{
	switch (dir)
	{
		case EAST:
			return &quot;EAST&quot;;

		case NORTH:
			return &quot;NORTH&quot;;

		case SOUTH:
			return &quot;SOUTH&quot;;

		case WEST:
			return &quot;WEST&quot;;
	}

	return &quot;UNKNOWN&quot;;
}
</code></pre>
<p>Viele Grüße,<br />
Dummie</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612874</guid><dc:creator><![CDATA[Dummie]]></dc:creator><pubDate>Mon, 10 Nov 2008 18:19:41 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;wie enum-artige struktur mit operator++ on Mon, 10 Nov 2008 18:31:25 GMT]]></title><description><![CDATA[<p>sowas ähnliches hatte ich auch. Allerdings finde ich Lsg nicht wirklich zufriedenstellend, denn StartDir ist nunmal 0 und nicht 0+1. Zudem sollte in der Lösung sicherheitshalber der Integrale Wert zugewiesen werden <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/1612884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612884</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Mon, 10 Nov 2008 18:31:25 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;wie enum-artige struktur mit operator++ on Mon, 10 Nov 2008 18:55:45 GMT]]></title><description><![CDATA[<p>muffmolch schrieb:</p>
<blockquote>
<p>Sponatn würd eich jetzt eine eigene Klasse schreiben, die const ints als Member besitzt un den ++/-- operator überladt. Aber das geht doch sicherlich eleganter, oder?</p>
</blockquote>
<p>Nein - Klassen <strong>sind</strong> elegant. <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>Aber da ist ja nicht viel dabei, mit einer Klasse bist du sowieso flexibler. Du kannst dann auch gleich sicherstellen, dass der <code>operator++</code> richtig überläuft, sodass du nur die 4 Werte annehmen kannst. Die String-Umwandlungsmethode kannst du auch gleich implementieren. Eventuell wäre auch ein überladener Cast-Operator nach <code>int</code> etwas; das hängt halt von deinen Anforderungen ab.</p>
<p>Wenn du willst, kannst du ja auch klassen-intern ein <code>enum</code> definieren, um die Konstanten nach aussen anzubieten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612895</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612895</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 10 Nov 2008 18:55:45 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;wie enum-artige struktur mit operator++ on Mon, 10 Nov 2008 19:07:38 GMT]]></title><description><![CDATA[<p>mit eleganter meinte ich sowas wie irgendeine abgefahrene template klasse.<br />
meine grauen hirnzellen arbeiten jetzt nach 16h arbeit nimme rso recht. hast du grad ne quick and dirty loesung zur hand? eins ohne enum? denn so ganz wie ich dann eine typsichere übergabe mache seh grad nicht... Denn die innerhalb der Klasse gehaltenen Typen sind ja wiederum ints... anders bei einem template, dass eben undefiniert für bestimtme richtugnen sein koennte</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612897</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Mon, 10 Nov 2008 19:07:38 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;wie enum-artige struktur mit operator++ on Mon, 10 Nov 2008 19:19:33 GMT]]></title><description><![CDATA[<p>Hmm, da hast du Recht. Ganz typsicher sind Enums nicht... Aber Templates scheinen mir hier der falsche Ansatz zu sein.</p>
<p>Ich bin übrigens gerade an deiner Lösung, die Klasse könnte grösser werden (von der Funktionalität, nicht vom Speicherplatz). Aber ich versuche, Typsicherheit einigermassen einzuhalten. <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/1612903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612903</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 10 Nov 2008 19:19:33 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;wie enum-artige struktur mit operator++ on Mon, 10 Nov 2008 19:32:55 GMT]]></title><description><![CDATA[<p>Also da wäre mal ein Ansatz. Ich hab einfach mal ein paar willkürliche Funktionen dazugefügt. Wahrscheinlich gibt es eine bessere Lösung, aber fürs Erste sollte es reichen.</p>
<pre><code class="language-cpp">class Direction
{
	public:
		enum DirectionType
		{
			East,
			North,
			West,
			South
		};

		static DirectionType StartDir();
		static DirectionType EndDir();

    public:
        Direction(DirectionType NewDir);

        DirectionType GetDir();
        std::string ToString();

        void SetDir(DirectionType NewDir);
        Direction&amp; operator= (DirectionType NewDir);

		// Präfix-Operatoren
        Direction operator++();
        Direction operator--();

        // Postfix-Operatoren
		Direction operator++(int);
		Direction operator--(int);

    private:
		int myDir;
};

bool operator== (const Direction&amp; Left, const Direction&amp; Right);
bool operator!= (const Direction&amp; Left, const Direction&amp; Right);
bool operator&lt;= (const Direction&amp; Left, const Direction&amp; Right);
bool operator&lt;  (const Direction&amp; Left, const Direction&amp; Right);
bool operator&gt;= (const Direction&amp; Left, const Direction&amp; Right);
bool operator&gt;  (const Direction&amp; Left, const Direction&amp; Right);

int main()
{
	for (Direction dir = Direction::StartDir(); dir &lt;= Direction::EndDir(); ++dir)
	{

	}
}
</code></pre>
<p>Wenn du keine anderen Werte als die im Enum zulassen willst, könntest du ja Exceptions verwenden. Falls du den Typ nur zum Iterieren brauchst, kannst du ja das Enum privat machen und nur die statischen Methoden anbieten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612909</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 10 Nov 2008 19:32:55 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;wie enum-artige struktur mit operator++ on Mon, 10 Nov 2008 19:47:21 GMT]]></title><description><![CDATA[<p>Ich finde &quot;Dummie&quot;s Beispiel gut, Klassen finde ich hier vollkommenen Overkill.</p>
<p>Achso, kleine Änderung von Dummies Code:</p>
<pre><code class="language-cpp">enum Dir
{
    EAST,
    NORTH,
    SOUTH,
    WEST,
	START_DIR = EAST,
    END_DIR = WEST+1
};

// Keine Ahnung, ob diese Funktion standardkonform ist
Dir&amp; operator++( Dir&amp; d )
{
	assert( d==EAST || d==NORTH || d==SOUTH );
	if ( d == EAST )
		d=NORTH;
	else if ( d == NORTH )
		d=SOUTH;
	else if ( d == SOUTH )
		d=WEST;
	return d;
}

..
for ( Dir i=START_DIR; i&lt;END_DIR; ++i )
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1612914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612914</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Mon, 10 Nov 2008 19:47:21 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;wie enum-artige struktur mit operator++ on Mon, 10 Nov 2008 19:55:42 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Ich finde &quot;Dummie&quot;s Beispiel gut, Klassen finde ich hier vollkommenen Overkill.</p>
</blockquote>
<p>Naja. Vielleicht für die For-Schleife schon noch gerade, aber man ist damit um einiges flexibler. Und inwiefern Overkill? Weil es einige Zeilen mehr Platz benötigt?</p>
<p>Vor allem kann man mit Klassen so etwas vermeiden (sofern man nicht <code>operator int</code> überlädt):</p>
<pre><code class="language-cpp">Direction dir;
int i = dir;
</code></pre>
<p>Badestrand schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Dir&amp; operator++( Dir&amp; d )
{
	assert( d==EAST || d==NORTH || d==SOUTH );
	if ( d == EAST )
		d=NORTH;
	else if ( d == NORTH )
		d=SOUTH;
	else if ( d == SOUTH )
		d=WEST;
	return d;
}
</code></pre>
</blockquote>
<p>Also ein <code>switch</code> wäre hier wohl das Mindeste. Wobei ich sowieso Modulo und Cast anwenden würde. Und die Assertion bringt nur im Debug-Modus was, Exception wäre vielleicht besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612919</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 10 Nov 2008 19:55:42 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;wie enum-artige struktur mit operator++ on Mon, 10 Nov 2008 20:57:23 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Badestrand schrieb:</p>
<blockquote>
<p>Ich finde &quot;Dummie&quot;s Beispiel gut, Klassen finde ich hier vollkommenen Overkill.</p>
</blockquote>
<p>Naja. Vielleicht für die For-Schleife schon noch gerade, aber man ist damit um einiges flexibler. Und inwiefern Overkill? Weil es einige Zeilen mehr Platz benötigt?</p>
</blockquote>
<p>Ja, alleine mit der Deklaration bist du bei 41 Zeilen, mit Definition vielleicht bei 200 (Leerzeilen mitgerechnet). Kann sein, dass ich gerade in einer Minimalismus-Phase bin oder hineinsteuere, aber wenn man mit einem Zehntel des Codes beinahe dasselbe erreichen kann, würde ich es vorziehen. Es ist nicht einmal die Wartung, die dürfte bei beiden Lösungen nahe 0 liegen. Es ist eher das Gesamtbild, also das schwierigere Hineinfinden in den Code, die erhöhte Dateienanzahl, die Übersicht leidet. Definitiv Geschmackssache, aber alles mit Klassen zu lösen (hier hat's auch Vorteile, keine Frage) ist halt nicht immer das Optimum.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Vor allem kann man mit Klassen so etwas vermeiden (sofern man nicht <code>operator int</code> überlädt):</p>
<pre><code class="language-cpp">Direction dir;
int i = dir;
</code></pre>
</blockquote>
<p>Hm, ich sehe nicht, wie man damit großartig Unfug anstellen könnte.</p>
<p>PS: Das Gefühl habe ich übrigens öfter, also dass bei &quot;modernem&quot;/&quot;extrem sauberen&quot; C++-Code so unglaublich viele Klassen und entsprechend Dateien und Codezeilen entstehen, dass m.M.n. viel an Übersicht verloren geht. Evtl bin ich im &quot;Quellcode-Verstehen&quot; unter'm Durchschnitt, aber wenn ich ein fremdes oder eigenes altes Projekt öffne und meine Augen 30 Klassen sehen, brauche ich etwas, um mich zurechtzufinden.<br />
Selbiges bei Funktionen, oft wird stur ausgelagert, solange es geht. Mache ich eigentlich auch, als Regel hatte ich für mich auch mal, dass bei jedem Quelltext-Kommentar der darunterstehende Code in eine sprechende Funktion ausgelagert und der Kommentar damit überflüssig wird. Leider bringt jede zusätzliche Funktion auch zusätzlichen Denk-Overhead mit, schließlich muss man sie im Gesamtkontext einordnen und den Code-Zweck jedesmal neu erfassen. Bei einer 50-zeiligen Funktion ist die Funktion als Ganzes unübersichtlicher, dafür bleibt der Kontext, das Äußere übersichtlicher. Ohje, ich merke schon, mein Coding-Stil ist wohl gerade im Umbruch.. <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/1612946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612946</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Mon, 10 Nov 2008 20:57:23 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;wie enum-artige struktur mit operator++ on Mon, 10 Nov 2008 21:50:40 GMT]]></title><description><![CDATA[<p>okay, ich hatte irgendwie gehofft, dass es da einen state of the art ansatz gäbe. an sich in ich mit beiden genannten lösungen zufrieden. mus smal schauen, ob und wie ich es nun angehe! ich dank eeuch schonmal an dieser stelle... die klasse ist natürlich absolut safe. zudem kann man konvertierungen in andere richtungsindizes recht schnell implementieren. allerdings habe ich etwas sorge, dass aufgrund der switch anweisungen etc. die laufzeit bei mir leiden koennte, denn es werden SEHR oft numerische einzeiler berechnugen in einer for schleife durchgeführt.<br />
aber, wie gesagt, an sich find eich dir lösungen gut... jetzt muss ich mal schauen.</p>
<p>danke und gute nach,<br />
SirAnn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612969</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Mon, 10 Nov 2008 21:50:40 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;wie enum-artige struktur mit operator++ on Mon, 10 Nov 2008 22:27:04 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Ohje, ich merke schon, mein Coding-Stil ist wohl gerade im Umbruch.. <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>Du hast schon Recht. Normalerweise bin ich überhaupt nicht der Typ, der für alles gleich eine eigene Klasse schreibt, ich pack auch oft zu viel in eine Klasse (frag Dravere :D).</p>
<p>Und ja, es kommt halt immer drauf an, was man will. Wenn einem Typsicherheit oder Flexibilität (Erweiterbarkeit) wichtig ist, ist man mit einer Klasse besser beraten. Vor allem glaube ich nicht, dass diese Klasse in ein Umfeld von weiteren hunderten von Klassen platziert wird. Die Übersichtlichkeit sollte also nicht so stark gefährdet sein. Durch aussagekräftige Kommentare muss man den Header auch nicht erneut anschauen, um die Funktionsweise zu verstehen.</p>
<p>muffmolch schrieb:</p>
<blockquote>
<p>allerdings habe ich etwas sorge, dass aufgrund der switch anweisungen etc. die laufzeit bei mir leiden koennte</p>
</blockquote>
<p><code>switch</code> ist sehr effizient, da durch eine LookUp-Table schnell zur richtigen Marke gesprungen wird. Auch dadurch, dass eine Klasse um den Enum-Typen gebaut wird, sollte die Performance nicht wirklich eingeschränkt werden. Und wie gesagt wäre auch Modulo eine Lösung (bei der du weniger schreiben müsstest, aber vielleicht ist sie auch langsamer).</p>
<p>Aber wenn es dir wirklich auf jede Mikrosekunde ankommt, solltest du mit einem Profiler herumexperimentieren, bevor du Schlüsse auf Performanceengpässe ziehst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612977</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 10 Nov 2008 22:27:04 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;wie enum-artige struktur mit operator++ on Tue, 11 Nov 2008 08:00:23 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Aber wenn es dir wirklich auf jede Mikrosekunde ankommt, solltest du mit einem Profiler herumexperimentieren, bevor du Schlüsse auf Performanceengpässe ziehst.</p>
</blockquote>
<p>das ist wohl wahr <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> war nur der erste Gedanke...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1613020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613020</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Tue, 11 Nov 2008 08:00:23 GMT</pubDate></item></channel></rss>