<?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[Enum in Konstruktor, warum gehtz nicht?]]></title><description><![CDATA[<p>Hallo,</p>
<pre><code class="language-cpp">class test
{
 public:
  test(test::state ExecutingFunction)
     {
      if(ExecutingFunction==test::TEST1)
         pfunc=&amp;test::test1;
      else
         pfunc=&amp;test::test2;
     }
  void test1(){cout&lt;&lt;&quot;TEST1&quot;&lt;&lt;endl;}
  void test2(){cout&lt;&lt;&quot;Test2&quot;&lt;&lt;endl;}
  void Exec(){this-&gt;pfunc;}
  enum state
        {
        TEST1,
        TEST2
        };
 private:
  void (test::*pfunc)();

};
</code></pre>
<p>was ist hier falsch?<br />
Fehler: ) erwartet</p>
<p>in der zeile wo der konstruktorkopf steht! (habe auch schon das test:: weggelassen, geht auch nicht!</p>
<p>Wie mache ich das denn richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/171196/enum-in-konstruktor-warum-gehtz-nicht</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 08:12:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/171196.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 23 Jan 2007 11:44:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Enum in Konstruktor, warum gehtz nicht? on Tue, 23 Jan 2007 11:44:46 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<pre><code class="language-cpp">class test
{
 public:
  test(test::state ExecutingFunction)
     {
      if(ExecutingFunction==test::TEST1)
         pfunc=&amp;test::test1;
      else
         pfunc=&amp;test::test2;
     }
  void test1(){cout&lt;&lt;&quot;TEST1&quot;&lt;&lt;endl;}
  void test2(){cout&lt;&lt;&quot;Test2&quot;&lt;&lt;endl;}
  void Exec(){this-&gt;pfunc;}
  enum state
        {
        TEST1,
        TEST2
        };
 private:
  void (test::*pfunc)();

};
</code></pre>
<p>was ist hier falsch?<br />
Fehler: ) erwartet</p>
<p>in der zeile wo der konstruktorkopf steht! (habe auch schon das test:: weggelassen, geht auch nicht!</p>
<p>Wie mache ich das denn richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215112</guid><dc:creator><![CDATA[sds]]></dc:creator><pubDate>Tue, 23 Jan 2007 11:44:46 GMT</pubDate></item><item><title><![CDATA[Reply to Enum in Konstruktor, warum gehtz nicht? on Tue, 23 Jan 2007 11:50:04 GMT]]></title><description><![CDATA[<p>Versuch mal das enum vor dem Konstruktur zu packen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215118</guid><dc:creator><![CDATA[Knuddlbaer]]></dc:creator><pubDate>Tue, 23 Jan 2007 11:50:04 GMT</pubDate></item><item><title><![CDATA[Reply to Enum in Konstruktor, warum gehtz nicht? on Tue, 23 Jan 2007 11:51:47 GMT]]></title><description><![CDATA[<p>Knuddlbaer schrieb:</p>
<blockquote>
<p>Versuch mal das enum vor dem Konstruktur zu packen</p>
</blockquote>
<p>muh das geht! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> da merkt man erstmal, das man garnix weiß!</p>
<p>Ich würde trotzdem um aufklärung bitten!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215119</guid><dc:creator><![CDATA[sds]]></dc:creator><pubDate>Tue, 23 Jan 2007 11:51:47 GMT</pubDate></item><item><title><![CDATA[Reply to Enum in Konstruktor, warum gehtz nicht? on Tue, 23 Jan 2007 11:55:09 GMT]]></title><description><![CDATA[<p>Es war meinerseits mal geraten.</p>
<p>Generell kann der Compiler nur das verwenden, was er kennt.<br />
Zu dem Zeitpunkt, an dem Du die enum verwendest, wurde diese<br />
dem Compiler noch nicht gezeigt.</p>
<p>Ich weiß nicht ob es spezielle Regeln innerhalb einer Klasse gibt.<br />
Nun aber weiß der Compiler was test::TEST1 zu bedeuten hat, weil er es vor verwendung schon mal gesehen hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215122</guid><dc:creator><![CDATA[Knuddlbaer]]></dc:creator><pubDate>Tue, 23 Jan 2007 11:55:09 GMT</pubDate></item><item><title><![CDATA[Reply to Enum in Konstruktor, warum gehtz nicht? on Tue, 23 Jan 2007 12:09:29 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich weiß nicht ob es spezielle Regeln innerhalb einer Klasse gibt.</p>
</blockquote>
<p>Ja, es gelten spezielle Regeln, bloss sind die für mich leider etwas verwirrend.<br />
Funktionen darf man ja z.B. verwenden egal wo sie stehen... ein nested enum aber wieder nicht.<br />
Wie's mit nested classes aussieht merk' ich mir auch nie, müsste ich jetzt ausprobieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215133</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 23 Jan 2007 12:09:29 GMT</pubDate></item><item><title><![CDATA[Reply to Enum in Konstruktor, warum gehtz nicht? on Tue, 23 Jan 2007 12:15:13 GMT]]></title><description><![CDATA[<p>Knuddlbaer schrieb:</p>
<blockquote>
<p>Es war meinerseits mal geraten.</p>
<p>Generell kann der Compiler nur das verwenden, was er kennt.<br />
Zu dem Zeitpunkt, an dem Du die enum verwendest, wurde diese<br />
dem Compiler noch nicht gezeigt.</p>
<p>Ich weiß nicht ob es spezielle Regeln innerhalb einer Klasse gibt.<br />
Nun aber weiß der Compiler was test::TEST1 zu bedeuten hat, weil er es vor verwendung schon mal gesehen hat.</p>
</blockquote>
<p>Grundsätzlich sind Bezeichner (lexikalisch) vor ihrer Verwendung zu deklarieren. Das ist die Erste und wichtigste Regel dazu. Eine weitere - praktisch weniger bedeutsame - Regel bezieht auf die Deklaration von Bezeichnern in Klassen, die Bezeichner in einem äußeren Scope verdecken. Eine Umordnung von Deklarationen - beschränkt durch die erste Regel - darf hierbei nicht zu unterschiedlicher Semantik führen.<br />
Drittens dürfen in der Definition von Funktionen (nicht in dem Teil, der zur Deklaration gehört - also ab dem { bzw. dem Funktions-try-Block bzw. der Initialisierungsliste von Konstruktoren), die in einer Klassendefinition definiert werden, alle Bezeichner, die dieser Klasse deklariert werden, verwendet werden, auch wenn diese lexikalisch erst danach erscheinen. Eine Klassendefinition wird also gewissermaßen 2mal geparst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215141</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 23 Jan 2007 12:15:13 GMT</pubDate></item><item><title><![CDATA[Reply to Enum in Konstruktor, warum gehtz nicht? on Tue, 23 Jan 2007 12:19:19 GMT]]></title><description><![CDATA[<p>Exakt:<br />
Deklarationen einer Klasse werden sequentiell (von oben nach unten) gelesen.<br />
In den (inline-) Funktionsrümpfen können aber auch auf weiter unten stehende Deklarationen zugegriffen werden (Funktionsaufrufe, Enums, Members etc.), da diese erst nach dem Parsen der Klasse analysiert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215145</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Tue, 23 Jan 2007 12:19:19 GMT</pubDate></item><item><title><![CDATA[Reply to Enum in Konstruktor, warum gehtz nicht? on Tue, 23 Jan 2007 12:20:50 GMT]]></title><description><![CDATA[<p>Knuddlbaer schrieb:</p>
<blockquote>
<p>Es war meinerseits mal geraten.</p>
<p>Generell kann der Compiler nur das verwenden, was er kennt.<br />
Zu dem Zeitpunkt, an dem Du die enum verwendest, wurde diese<br />
dem Compiler noch nicht gezeigt.</p>
<p>Ich weiß nicht ob es spezielle Regeln innerhalb einer Klasse gibt.<br />
Nun aber weiß der Compiler was test::TEST1 zu bedeuten hat, weil er es vor verwendung schon mal gesehen hat.</p>
</blockquote>
<p>Ich bin ziemlich sicher, dass der Compiler Attribute und Funktionen der Klasse auch mit durchsucht, aber Typen müssen vorher bekannt - zumindestens muß dem Compiler ersichtlich sein, dass es sich um einen Typen handelt. So reicht eine Forwarddeklaration aus - wo möglich - allerdings braucht's die konkrete Typedefinition überall da, wo sie verwendet wird:</p>
<pre><code class="language-cpp">class B; // forward declaration (*)

class A {
public:
   enum enumT {
      YO,
      NO
   };
   typedef int intT;

   A(enumT t) : myEnumT(t), myIntT(-1) {} // enumT hier schon bekannt
   A(intT t) : myEnumT(NO), myIntT(t) {} // intT hier schon bekannt
   A(B t); // B unbekannt - aber als Typ kenntlich durch (*)
private:
   enumT myEnumT;
   intT myIntT;
};

class B {
public:
   int i;
};

A::A(B t) : myEnumT(NO), myIntT(t.i) {} // B hier bekannt
</code></pre>
<p>camper kann das bestimmt noch exakter und besser formulieren...</p>
<p>EDIT: Oh, hat er schon ... naja, jetzt lösch' ich's nicht mehr. <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>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1215147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215147</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 23 Jan 2007 12:20:50 GMT</pubDate></item><item><title><![CDATA[Reply to Enum in Konstruktor, warum gehtz nicht? on Tue, 23 Jan 2007 12:53:31 GMT]]></title><description><![CDATA[<p>Man kann noch etwas noch etwas präziser sein hinsichtlich dessen, wann genau ein Bezeichner deklariert ist (der sog. point of definition) - für unser Problem hier ist das eher bedeutungslos. Wichtig wid das mitunter bei enum-Definitionen und bei der Intialisierung von Variablen.<br />
z.B.</p>
<pre><code class="language-cpp">namespace A
{
    char a = 5;
    namespace B
    {
        char a(a); // Initialisiert mit A::a, also 5
    }
    namespace C
    {
        char a = a; // &quot;Initialisiert&quot; mit sich selbst, der Inhalt bleibt unbestimmt
    }
}
enum X
{
    null, eins = null + 1  // Enumkonstanten sind ab dem folgenden Komma deklariert
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1215179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1215179</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 23 Jan 2007 12:53:31 GMT</pubDate></item></channel></rss>