<?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[switch -&amp;gt; case class::static const]]></title><description><![CDATA[<p>Grüsse zusammen,</p>
<p>Zuerst mal etwas kurzen Code:<br />
<code>Base.hpp</code></p>
<pre><code class="language-cpp">typedef unsigned int t_Type;

class CBase
{
    // Static attributes //
public:
    static t_Type register_type();

    // Methods //
public:
    virtual t_Type get_type() const = 0;
};
</code></pre>
<p><code>Base.cpp</code></p>
<pre><code class="language-cpp">#include &quot;Base.hpp&quot;

t_Type CBase::register_type()
{
    static t_Type TypeCounter = 0;
    return TypeCounter++;
}
</code></pre>
<p><code>ExampleType.hpp</code></p>
<pre><code class="language-cpp">#include &quot;Base.hpp&quot;

class CExampleType : public CBase
{
    // Static attributes //
public:
    static t_Type const TYPE;

    // Methods //
public:
    virtual t_Type get_type() const { return TYPE; };
};
</code></pre>
<p><code>ExampleType.cpp</code></p>
<pre><code class="language-cpp">#include &quot;ExampleType.hpp&quot;

t_Type const CExampleType::TYPE = CBase::register_type();
</code></pre>
<p><code>main.cpp oder sonst wo halt</code></p>
<pre><code class="language-cpp">CBase* pBase; // Gültiger zeiger auf ein Object, wessen Klasse von CBase abgeleitet wurde.

switch(pBase-&gt;get_type())
{
case CFooType::TYPE :
    { write_object(*dynamic_cast&lt;CFooType*&gt;(pBase)); }
    break;
case CExampleType::TYPE :
    { write_object(*dynamic_cast&lt;CExampleType*&gt;(pBase)); }
    break;
// ...
}
</code></pre>
<p>Dabei kommt der Fehler:<br />
<code>case expression not constant</code></p>
<p>Wenn ich das richtig begreife, dann kommt dies deswegen, weil die TYPE Variablen erst zur Laufzeit mit Werten befüllt werden, oder?</p>
<p>Was habe ich für alternativen?</p>
<ul>
<li>If Else will ich nicht, das sind zu viele Typen.</li>
<li>Für eine Map bräuchte ich zuerst einen Funktor, welcher das dynamic_cast und die Dereferenzierung durchführt. Welcher aber noch ziemlich komplex werden könnte, für sowas einfaches, da der dynamic_cast immer mit einer anderen Klasse ausgeführt wird.</li>
<li>Ich könnte auch eine Map machen, welche immer auf eine andere Funktion zeigt, aber viel zu viel Aufwand.</li>
<li>Sonstiges?</li>
</ul>
<p>Danke für weitere Ideen!</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/215455/switch-gt-case-class-static-const</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 07:53:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/215455.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 11 Jun 2008 10:05:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to switch -&amp;gt; case class::static const on Wed, 11 Jun 2008 10:05:06 GMT]]></title><description><![CDATA[<p>Grüsse zusammen,</p>
<p>Zuerst mal etwas kurzen Code:<br />
<code>Base.hpp</code></p>
<pre><code class="language-cpp">typedef unsigned int t_Type;

class CBase
{
    // Static attributes //
public:
    static t_Type register_type();

    // Methods //
public:
    virtual t_Type get_type() const = 0;
};
</code></pre>
<p><code>Base.cpp</code></p>
<pre><code class="language-cpp">#include &quot;Base.hpp&quot;

t_Type CBase::register_type()
{
    static t_Type TypeCounter = 0;
    return TypeCounter++;
}
</code></pre>
<p><code>ExampleType.hpp</code></p>
<pre><code class="language-cpp">#include &quot;Base.hpp&quot;

class CExampleType : public CBase
{
    // Static attributes //
public:
    static t_Type const TYPE;

    // Methods //
public:
    virtual t_Type get_type() const { return TYPE; };
};
</code></pre>
<p><code>ExampleType.cpp</code></p>
<pre><code class="language-cpp">#include &quot;ExampleType.hpp&quot;

t_Type const CExampleType::TYPE = CBase::register_type();
</code></pre>
<p><code>main.cpp oder sonst wo halt</code></p>
<pre><code class="language-cpp">CBase* pBase; // Gültiger zeiger auf ein Object, wessen Klasse von CBase abgeleitet wurde.

switch(pBase-&gt;get_type())
{
case CFooType::TYPE :
    { write_object(*dynamic_cast&lt;CFooType*&gt;(pBase)); }
    break;
case CExampleType::TYPE :
    { write_object(*dynamic_cast&lt;CExampleType*&gt;(pBase)); }
    break;
// ...
}
</code></pre>
<p>Dabei kommt der Fehler:<br />
<code>case expression not constant</code></p>
<p>Wenn ich das richtig begreife, dann kommt dies deswegen, weil die TYPE Variablen erst zur Laufzeit mit Werten befüllt werden, oder?</p>
<p>Was habe ich für alternativen?</p>
<ul>
<li>If Else will ich nicht, das sind zu viele Typen.</li>
<li>Für eine Map bräuchte ich zuerst einen Funktor, welcher das dynamic_cast und die Dereferenzierung durchführt. Welcher aber noch ziemlich komplex werden könnte, für sowas einfaches, da der dynamic_cast immer mit einer anderen Klasse ausgeführt wird.</li>
<li>Ich könnte auch eine Map machen, welche immer auf eine andere Funktion zeigt, aber viel zu viel Aufwand.</li>
<li>Sonstiges?</li>
</ul>
<p>Danke für weitere Ideen!</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526888</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 11 Jun 2008 10:05:06 GMT</pubDate></item><item><title><![CDATA[Reply to switch -&amp;gt; case class::static const on Wed, 11 Jun 2008 10:16:23 GMT]]></title><description><![CDATA[<p>Wie wäre es mit einem template Funktor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526898</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 11 Jun 2008 10:16:23 GMT</pubDate></item><item><title><![CDATA[Reply to switch -&amp;gt; case class::static const on Wed, 11 Jun 2008 10:21:49 GMT]]></title><description><![CDATA[<p>Warum versuchst Du, das nachzubauen, was bereits in der Sprache drin ist? Implementier den write_object-Aufruf in virtuellen Methoden der jeweiligen Klasse und lass den Compiler diese Entscheidungstabelle generieren - genau dafür sind doch virtuelle Methoden da.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526901</guid><dc:creator><![CDATA[Chewie83]]></dc:creator><pubDate>Wed, 11 Jun 2008 10:21:49 GMT</pubDate></item><item><title><![CDATA[Reply to switch -&amp;gt; case class::static const on Wed, 11 Jun 2008 12:12:40 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Wie wäre es mit einem template Funktor?</p>
</blockquote>
<p>Überleg mal, das geht nicht so einfach. Du kannst einer Map nur ein Typ als zweiter Typ übergeben. Als müsste man wohl Polymorphie für den Funktor anwenden, was die Sache ein wenig zu komplex, für einen normalen Funktor macht.</p>
<p>Chewie83 schrieb:</p>
<blockquote>
<p>Warum versuchst Du, das nachzubauen, was bereits in der Sprache drin ist? Implementier den write_object-Aufruf in virtuellen Methoden der jeweiligen Klasse und lass den Compiler diese Entscheidungstabelle generieren - genau dafür sind doch virtuelle Methoden da.</p>
</blockquote>
<p>Wenn es so einfach wäre. CBase kommt aus einer Baum-Klassenstruktur. Die ExampleTypes sind Blätter und Knoten, welche das Interface dieser Klassenstruktur benutzen. Diese Baum-Klassenstruktur wird allerdings auch in anderen Hierarchien verwendet, wo es kein write_object benötigt. Das write_object ist halt Teil eines Writers, welcher die Daten auf seine Weise in eine Datei schreibt.</p>
<p>Aber trotz dem, dass deine Idee zwar nicht funktioniert, so hast du mich grad auf eine andere gebracht, welche ich mal überprüfen werde. Danke! <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>Falls noch jemand Ideen hat, immer her damit <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526976</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 11 Jun 2008 12:12:40 GMT</pubDate></item><item><title><![CDATA[Reply to switch -&amp;gt; case class::static const on Wed, 11 Jun 2008 12:21:00 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Falls noch jemand Ideen hat, immer her damit <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>
</blockquote>
<p>Wenn Du die write-Object-Methode lieber extern implementieren möchtest kannst Du das ja immer noch tun, indem Du es sozusagen als Visitor implementierst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526982</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Wed, 11 Jun 2008 12:21:00 GMT</pubDate></item><item><title><![CDATA[Reply to switch -&amp;gt; case class::static const on Wed, 11 Jun 2008 12:26:09 GMT]]></title><description><![CDATA[<p>Jester schrieb:</p>
<blockquote>
<p>Wenn Du die write-Object-Methode lieber extern implementieren möchtest kannst Du das ja immer noch tun, indem Du es sozusagen als Visitor implementierst.</p>
</blockquote>
<p>Etwas in der Richtung verfolge ich gerade. Bin mir aber immer noch nicht zu 100% sicher, ob es funktioniert und schön aussieht.</p>
<p>Es ist manchmal echt schlimm. Man löst verschiedene Probleme und mit der Zeit verbohrt man sich auf gewisse Konzepte und übersieht völlig, dass auch anderes noch gehen würde. Das alte Konzept zwar beibehalten, aber neues dazu setzen. Aber dafür hat man ja zumindest dieses schöne Forum <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="😃"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526989</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 11 Jun 2008 12:26:09 GMT</pubDate></item></channel></rss>