<?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[Initialisierungsreihenfolge bei statischen Variablen und Konstanten in Klassen]]></title><description><![CDATA[<p>Ich habe ein Problem mit der Initialisierungsreihenfolge von statischen Konstanten und Variablen in Klassen, die in verschiedenen Dateien liegen. Hier ein Beispielcode:</p>
<p>Test.h</p>
<pre><code class="language-cpp">#ifndef TEST_H
#define TEST_H

class Test
{
public:

	static int EchteKonstante;
	static int Pseudokonstante;

private:

	Test();

	static Test m_Test;
};

#endif
</code></pre>
<p>Test1.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;Test.h&quot;

using namespace std;

Test Test::m_Test;

Test::Test()
{
	cout &lt;&lt; &quot;Konstruktor:\n&quot;;
	cout &lt;&lt; &quot;Echte Konstante: &quot; &lt;&lt; EchteKonstante &lt;&lt; &quot;\n&quot;;
	cout &lt;&lt; &quot;Pseudokonstante: &quot; &lt;&lt; Pseudokonstante &lt;&lt; &quot;\n&quot;;
}
</code></pre>
<p>Test2.cpp</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &quot;Test.h&quot;

int Test::EchteKonstante = -7;

int Test::Pseudokonstante = rand() + 1;
</code></pre>
<p>Main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;Test.h&quot;

using namespace std;

int main()
{
	cout &lt;&lt; &quot;Main:\n&quot;;
	cout &lt;&lt; &quot;Echte Konstante: &quot; &lt;&lt; Test::EchteKonstante &lt;&lt; &quot;\n&quot;;
	cout &lt;&lt; &quot;Pseudokonstante: &quot; &lt;&lt; Test::Pseudokonstante &lt;&lt; &quot;\n&quot;;
}
</code></pre>
<p>Ich hätte gedacht, dass Konstanten vor Variablen initialisiert werden. Bei der echten Konstante, die also wirklich mit einem bekannten Wert initialisiert wird, ist das auch der Fall, aber bei der Pseudokonstante, die ihren Wert aus einer Funktion holt, nicht. Die Ausgabe ist:</p>
<pre><code>Konstruktor:
Echte Konstante: -7
Pseudokonstante: 0
Main:
Echte Konstante: -7
Pseudokonstante: 42
</code></pre>
<p>Wenn ich den Quellcode in Test1.cpp und Test2.cpp austausche, funktioniert es:</p>
<pre><code>Konstruktor:
Echte Konstante: -7
Pseudokonstante: 42
Main:
Echte Konstante: -7
Pseudokonstante: 42
</code></pre>
<p>Heißt das also, dass sich die Initialisierungsreihenfolge nach der Reihenfolge der Quellcodedateien in der Projektdatei richtet? Ich brauche nämlich die Pseudokonstante im Konstruktor, die beiden müssen jedoch trotzdem in verschiedenen Dateien implementiert werden. (Weil die Variable und der Konstruktor plattformunabhängig sind, während sich der Wet der Pseudokonstante in meinem richtigen Programm je nach OS und Implementierung unterscheidet und ich möchte das eben trennen.) Und ich kann mich ja nicht darauf verlassen, dass der Quellcode immer in einer bestimmten Reihenfolge kompiliert wird. Was kann ich tun, um auf Codeebene sicher zu stellen, dass die Pseudokonstante vor der Testvariable initialisiert wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/277330/initialisierungsreihenfolge-bei-statischen-variablen-und-konstanten-in-klassen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 22:51:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277330.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 16 Nov 2010 22:24:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Initialisierungsreihenfolge bei statischen Variablen und Konstanten in Klassen on Tue, 16 Nov 2010 22:24:26 GMT]]></title><description><![CDATA[<p>Ich habe ein Problem mit der Initialisierungsreihenfolge von statischen Konstanten und Variablen in Klassen, die in verschiedenen Dateien liegen. Hier ein Beispielcode:</p>
<p>Test.h</p>
<pre><code class="language-cpp">#ifndef TEST_H
#define TEST_H

class Test
{
public:

	static int EchteKonstante;
	static int Pseudokonstante;

private:

	Test();

	static Test m_Test;
};

#endif
</code></pre>
<p>Test1.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;Test.h&quot;

using namespace std;

Test Test::m_Test;

Test::Test()
{
	cout &lt;&lt; &quot;Konstruktor:\n&quot;;
	cout &lt;&lt; &quot;Echte Konstante: &quot; &lt;&lt; EchteKonstante &lt;&lt; &quot;\n&quot;;
	cout &lt;&lt; &quot;Pseudokonstante: &quot; &lt;&lt; Pseudokonstante &lt;&lt; &quot;\n&quot;;
}
</code></pre>
<p>Test2.cpp</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &quot;Test.h&quot;

int Test::EchteKonstante = -7;

int Test::Pseudokonstante = rand() + 1;
</code></pre>
<p>Main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;Test.h&quot;

using namespace std;

int main()
{
	cout &lt;&lt; &quot;Main:\n&quot;;
	cout &lt;&lt; &quot;Echte Konstante: &quot; &lt;&lt; Test::EchteKonstante &lt;&lt; &quot;\n&quot;;
	cout &lt;&lt; &quot;Pseudokonstante: &quot; &lt;&lt; Test::Pseudokonstante &lt;&lt; &quot;\n&quot;;
}
</code></pre>
<p>Ich hätte gedacht, dass Konstanten vor Variablen initialisiert werden. Bei der echten Konstante, die also wirklich mit einem bekannten Wert initialisiert wird, ist das auch der Fall, aber bei der Pseudokonstante, die ihren Wert aus einer Funktion holt, nicht. Die Ausgabe ist:</p>
<pre><code>Konstruktor:
Echte Konstante: -7
Pseudokonstante: 0
Main:
Echte Konstante: -7
Pseudokonstante: 42
</code></pre>
<p>Wenn ich den Quellcode in Test1.cpp und Test2.cpp austausche, funktioniert es:</p>
<pre><code>Konstruktor:
Echte Konstante: -7
Pseudokonstante: 42
Main:
Echte Konstante: -7
Pseudokonstante: 42
</code></pre>
<p>Heißt das also, dass sich die Initialisierungsreihenfolge nach der Reihenfolge der Quellcodedateien in der Projektdatei richtet? Ich brauche nämlich die Pseudokonstante im Konstruktor, die beiden müssen jedoch trotzdem in verschiedenen Dateien implementiert werden. (Weil die Variable und der Konstruktor plattformunabhängig sind, während sich der Wet der Pseudokonstante in meinem richtigen Programm je nach OS und Implementierung unterscheidet und ich möchte das eben trennen.) Und ich kann mich ja nicht darauf verlassen, dass der Quellcode immer in einer bestimmten Reihenfolge kompiliert wird. Was kann ich tun, um auf Codeebene sicher zu stellen, dass die Pseudokonstante vor der Testvariable initialisiert wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981488</guid><dc:creator><![CDATA[Braun]]></dc:creator><pubDate>Tue, 16 Nov 2010 22:24:26 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierungsreihenfolge bei statischen Variablen und Konstanten in Klassen on Tue, 16 Nov 2010 22:30:33 GMT]]></title><description><![CDATA[<p><a href="https://www.google.de/search?&amp;q=c%2B%2B%20static%20initialization%20fiasco" rel="nofollow">Google: c++ static initialization fiasco</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981493</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 16 Nov 2010 22:30:33 GMT</pubDate></item></channel></rss>