<?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[static const]]></title><description><![CDATA[<p>Hi,<br />
ich habe im Moment ein merkwürdiges Problem:<br />
Zunächst habe ich eine Singleton-Klasse die im Konstruktor einige Konstanten aus einer Datei lädt und in einer std::map speichert.<br />
Jetzt will ich an anderer Stelle im Programm damit einige oft benötigte Konstanten initialisieren und danach auch nicht mehr ändern.<br />
Merkwürdigerweise kann ich zur Initialisierung der Konstante eine Methode des Singletons aufrufen bevor der Singleton-Konstruktor ausgeführt wurde?! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Das äußert sich natürlich in falschen Werten für die Konstanten, da sie noch nicht in der std::map vorhanden sind.<br />
Ansonsten arbeiten alle Methoden einwandfrei, also wenn der Konstruktor einmal ausgeführt wurde.</p>
<p>Hat jemand eine Idee wie das Zustande kommt?</p>
<p>Ich habe auch mal testweise einfach das &quot;const&quot; bei der Konstante weggelassen, das ändert auch nichts. Es mag ja sein das man Konstanten nicht auf diese weise initialisieren soll, aber warum läßt der Compiler das dann zu?</p>
<p>CConfigNode.h:</p>
<pre><code class="language-cpp">class CConfigNode {
public:
    // ...
    static const uint16 CN_ID_FILEROOT;  // hier ist die Konstante
    // ...
};
</code></pre>
<p>CConfigNode.cpp:</p>
<pre><code class="language-cpp">#include &quot;CConfigNode.h&quot;
// ...
// initialisierung der Konstante
const uint16 CConfigNode::CN_ID_FILEROOT = CConfigNameTable::getInstance().getIdFromName(&quot;fileroot&quot;);
// ...
</code></pre>
<p>CConfigNameTable.h:</p>
<pre><code class="language-cpp">// das Singleton
class CConfigNameTable {
public:
    // ...
    static const CConfigNameTable&amp; getInstance() { return instance; }

    uint16 getIdFromName(const std::string&amp; sName) const;
private:
    // ...
    static CConfigNameTable instance;
};
</code></pre>
<p>Dank im voraus,<br />
Coolcat</p>
<p>P.S.:<br />
Falls wichtig:<br />
Compiler: GCC 4.1.1 / FC5 Linux / Kernel: 2.6.17-1.2187_FC5</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/160398/static-const</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 05:45:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/160398.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 25 Sep 2006 14:09:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to static const on Mon, 25 Sep 2006 14:11:14 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich habe im Moment ein merkwürdiges Problem:<br />
Zunächst habe ich eine Singleton-Klasse die im Konstruktor einige Konstanten aus einer Datei lädt und in einer std::map speichert.<br />
Jetzt will ich an anderer Stelle im Programm damit einige oft benötigte Konstanten initialisieren und danach auch nicht mehr ändern.<br />
Merkwürdigerweise kann ich zur Initialisierung der Konstante eine Methode des Singletons aufrufen bevor der Singleton-Konstruktor ausgeführt wurde?! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Das äußert sich natürlich in falschen Werten für die Konstanten, da sie noch nicht in der std::map vorhanden sind.<br />
Ansonsten arbeiten alle Methoden einwandfrei, also wenn der Konstruktor einmal ausgeführt wurde.</p>
<p>Hat jemand eine Idee wie das Zustande kommt?</p>
<p>Ich habe auch mal testweise einfach das &quot;const&quot; bei der Konstante weggelassen, das ändert auch nichts. Es mag ja sein das man Konstanten nicht auf diese weise initialisieren soll, aber warum läßt der Compiler das dann zu?</p>
<p>CConfigNode.h:</p>
<pre><code class="language-cpp">class CConfigNode {
public:
    // ...
    static const uint16 CN_ID_FILEROOT;  // hier ist die Konstante
    // ...
};
</code></pre>
<p>CConfigNode.cpp:</p>
<pre><code class="language-cpp">#include &quot;CConfigNode.h&quot;
// ...
// initialisierung der Konstante
const uint16 CConfigNode::CN_ID_FILEROOT = CConfigNameTable::getInstance().getIdFromName(&quot;fileroot&quot;);
// ...
</code></pre>
<p>CConfigNameTable.h:</p>
<pre><code class="language-cpp">// das Singleton
class CConfigNameTable {
public:
    // ...
    static const CConfigNameTable&amp; getInstance() { return instance; }

    uint16 getIdFromName(const std::string&amp; sName) const;
private:
    // ...
    static CConfigNameTable instance;
};
</code></pre>
<p>Dank im voraus,<br />
Coolcat</p>
<p>P.S.:<br />
Falls wichtig:<br />
Compiler: GCC 4.1.1 / FC5 Linux / Kernel: 2.6.17-1.2187_FC5</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1144097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1144097</guid><dc:creator><![CDATA[Coolcat]]></dc:creator><pubDate>Mon, 25 Sep 2006 14:11:14 GMT</pubDate></item><item><title><![CDATA[Reply to static const on Mon, 25 Sep 2006 14:16:47 GMT]]></title><description><![CDATA[<p>Eine statische Memberfunktion kann doch ohne vorhandenes Objekt ausgeführt werden. Warum sollte der Compiler bei dir meckern?<br />
Ich würde das Singleton sowieso ein wenig anders machen, so dass der Aufruf von getInstance auch den Konstruktor aufruft (beim ersten Mal). Das kann man machen, indem du nicht eine Referenz, sondern einen Pointer zurückgibst und den bei Bedarf mit new erstellst.<br />
Wie erstellst du denn dein instance?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1144103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1144103</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Mon, 25 Sep 2006 14:16:47 GMT</pubDate></item><item><title><![CDATA[Reply to static const on Mon, 25 Sep 2006 14:20:37 GMT]]></title><description><![CDATA[<p>Sry, vergessen:</p>
<p>CConfigNameTable.cpp</p>
<pre><code class="language-cpp">CConfigNameTable CConfigNameTable::instance = CConfigNameTable();
</code></pre>
<blockquote>
<p>Eine statische Memberfunktion kann doch ohne vorhandenes Objekt ausgeführt werden.</p>
</blockquote>
<p>Klar, aber getIdFromName() ist nicht statisch. <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="😕"
    /></p>
<p>Coolcat</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1144109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1144109</guid><dc:creator><![CDATA[Coolcat]]></dc:creator><pubDate>Mon, 25 Sep 2006 14:20:37 GMT</pubDate></item><item><title><![CDATA[Reply to static const on Mon, 25 Sep 2006 14:27:56 GMT]]></title><description><![CDATA[<p>Aber getInstance() ist static.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1144115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1144115</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Mon, 25 Sep 2006 14:27:56 GMT</pubDate></item><item><title><![CDATA[Reply to static const on Mon, 25 Sep 2006 14:40:07 GMT]]></title><description><![CDATA[<p>Hm, hab es auf deinen Rat hin jetzt so gelöst:</p>
<pre><code class="language-cpp">class CConfigNameTable {
public:
    static const CConfigNameTable&amp; getInstance() {
        static CConfigNameTable instance = CConfigNameTable();
        return instance;
    }
    // ...
};
</code></pre>
<p>das funktioniert. <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 verstehe allerdings immer noch nicht warum das andere nicht funktionierte.</p>
<p>Coolcat</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1144127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1144127</guid><dc:creator><![CDATA[Coolcat]]></dc:creator><pubDate>Mon, 25 Sep 2006 14:40:07 GMT</pubDate></item><item><title><![CDATA[Reply to static const on Mon, 25 Sep 2006 15:17:57 GMT]]></title><description><![CDATA[<p>Coolcat schrieb:</p>
<blockquote>
<p>Hm, hab es auf deinen Rat hin jetzt so gelöst:</p>
</blockquote>
<p>So reicht auch, sonst hast Du eine unerwünschte Copyconstruction aus einem Temporary (oder?!). Letzteres würde aber auch verhindert wenn Du den Konstruktor des Singletons private machen würdest.</p>
<pre><code class="language-cpp">class CConfigNameTable {
public:
    static const CConfigNameTable&amp; getInstance() {
        static CConfigNameTable instance;
        return instance;
    }
};
</code></pre>
<blockquote>
<p>Ich verstehe allerdings immer noch nicht warum das andere nicht funktionierte.</p>
</blockquote>
<p>Weil die Initialisierungsreihenfolge von statischen Objekten auf File-Scope nicht garantiert ist. Will heissen es könnte sein dass die statischen Member von CConfigNode initialisiert werden bevor das statische Member instance von CConfigNameTable initialisiert wurde. Statische Objekte in Funktions-Scope werden hingegen beim ersten Aufruf der Funktion initialisiert, und Du hast so eine definierte Initialisierungsreihenfolge.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1144160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1144160</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 25 Sep 2006 15:17:57 GMT</pubDate></item><item><title><![CDATA[Reply to static const on Mon, 25 Sep 2006 15:25:52 GMT]]></title><description><![CDATA[<blockquote>
<p>So reicht auch, sonst hast Du eine unerwünschte Copyconstruction aus einem Temporary (oder?!)</p>
</blockquote>
<p>Ich denke doch das der Compiler schlau genug ist das zu erkennen. Naja, ich habs trotzdem mal geändert. :p</p>
<blockquote>
<p>Will heissen es könnte sein dass die statischen Member von CConfigNode initialisiert werden bevor das statische Member instance von CConfigNameTable initialisiert wurde.</p>
</blockquote>
<p>Ok, das reicht mir <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>thx @ all</p>
<p>Coolcat</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1144167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1144167</guid><dc:creator><![CDATA[Coolcat]]></dc:creator><pubDate>Mon, 25 Sep 2006 15:25:52 GMT</pubDate></item></channel></rss>