<?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 von Statics]]></title><description><![CDATA[<p>Hi,</p>
<p>mir ist klar, dass die Initialisierungsreihenfolge von mit static deklarierten Variablen über verschiedene Compilation-Units undefiniert ist.</p>
<p>Generell habe ich eine Klasse &quot;Document&quot; von der verschiedene andere Dokumente erben, z.B. XmlDocument, PDFDocument, etc. Etwa so</p>
<p>class Document<br />
{<br />
public:<br />
Deserialize(...);<br />
};</p>
<p>class XmlDocument : public Document;<br />
class PDFDocument : public Document;</p>
<p>Dann habe ich eine Klasse DocumentCreator (als Singelton!), welche im Prinzip so aussieht</p>
<p>class DocumentCreator : publicSingelton<br />
{<br />
public:<br />
DocumentCreator&amp; Instance();<br />
void Register(std::string&amp; Identification, CreationMethod* Method);<br />
Document* CreateDocument(std::string&amp; Identification);<br />
};</p>
<p>In jeder CPP Datei für die verschiedenen Dokumente will ich</p>
<p>DocumentCreator::Instance().Register(std::string(&quot;XmlDocument&quot;), &amp;myMethod);</p>
<p>aufrufen. Das passiert ja alles statisch bzw bei der Initialisierung. Wenn ich also ein neues Dokument hinzufügen möchte, brauche ich lediglich die CPP Datei zum Projekt hinzulinken und beim ausführen des Startup-Code führt der Compiler automatisch das Registerieren der Klasse beim DocumentCreator aus.</p>
<p>Das Problem ist jetzt, dass ich natürlich sichergehen muss, dass mein Singelton BEVOR allem anderen initialisiert wird. (Innerhalb der CPP Datei fürs Singelton befindet sich die Instanzvariable des Singeltons, welche dort zunächst auf 0 gesetzt wird. Nach Singelton-Manir wird in Instance() geprüft ob diese Variable noch 0 ist und dann eben ggf. eine Instanz erzeugt - ich will sichergehen, dass diese Variable BEVOR dem ersten Aufruf zum Singelton auf 0 initialisiert wurde)</p>
<p>Kennt jemand einen Ausweg dem dem Dilemma? Da ja die Initialisierungsreihenfolge von statics undefiniert ist, bin ich nicht sicher, ob man das überhaupt irgendwie auf die Weise, wie ich sie bisher habe, lösen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/266750/initialisierungsreihenfolge-von-statics</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 16:07:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/266750.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 13 May 2010 17:19:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Initialisierungsreihenfolge von Statics on Thu, 13 May 2010 17:19:25 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>mir ist klar, dass die Initialisierungsreihenfolge von mit static deklarierten Variablen über verschiedene Compilation-Units undefiniert ist.</p>
<p>Generell habe ich eine Klasse &quot;Document&quot; von der verschiedene andere Dokumente erben, z.B. XmlDocument, PDFDocument, etc. Etwa so</p>
<p>class Document<br />
{<br />
public:<br />
Deserialize(...);<br />
};</p>
<p>class XmlDocument : public Document;<br />
class PDFDocument : public Document;</p>
<p>Dann habe ich eine Klasse DocumentCreator (als Singelton!), welche im Prinzip so aussieht</p>
<p>class DocumentCreator : publicSingelton<br />
{<br />
public:<br />
DocumentCreator&amp; Instance();<br />
void Register(std::string&amp; Identification, CreationMethod* Method);<br />
Document* CreateDocument(std::string&amp; Identification);<br />
};</p>
<p>In jeder CPP Datei für die verschiedenen Dokumente will ich</p>
<p>DocumentCreator::Instance().Register(std::string(&quot;XmlDocument&quot;), &amp;myMethod);</p>
<p>aufrufen. Das passiert ja alles statisch bzw bei der Initialisierung. Wenn ich also ein neues Dokument hinzufügen möchte, brauche ich lediglich die CPP Datei zum Projekt hinzulinken und beim ausführen des Startup-Code führt der Compiler automatisch das Registerieren der Klasse beim DocumentCreator aus.</p>
<p>Das Problem ist jetzt, dass ich natürlich sichergehen muss, dass mein Singelton BEVOR allem anderen initialisiert wird. (Innerhalb der CPP Datei fürs Singelton befindet sich die Instanzvariable des Singeltons, welche dort zunächst auf 0 gesetzt wird. Nach Singelton-Manir wird in Instance() geprüft ob diese Variable noch 0 ist und dann eben ggf. eine Instanz erzeugt - ich will sichergehen, dass diese Variable BEVOR dem ersten Aufruf zum Singelton auf 0 initialisiert wurde)</p>
<p>Kennt jemand einen Ausweg dem dem Dilemma? Da ja die Initialisierungsreihenfolge von statics undefiniert ist, bin ich nicht sicher, ob man das überhaupt irgendwie auf die Weise, wie ich sie bisher habe, lösen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896773</guid><dc:creator><![CDATA[Morle]]></dc:creator><pubDate>Thu, 13 May 2010 17:19:25 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierungsreihenfolge von Statics on Thu, 13 May 2010 17:46:51 GMT]]></title><description><![CDATA[<p>Was soll das für einen Sinn machen? - Du weisst ja, dass du sobald du <code>::Instance</code> aufrufst das Objekt falls es noch nicht existiert hat erstellt wird. Probleme kann das eigentlich nur geben, wenn du noch andere Singletons hast und die miteinander reden sollen und sich irgendwie zyklisch aufrufen. Das wäre aber sonst ein genereller Denkfehler und das hast du hier ja auch nicht, wenn ich das richtig sehe..</p>
<p>Im übrigen ist ist es garantiert, dass statische Variablen vor der main initialisiert sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896778</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 13 May 2010 17:46:51 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierungsreihenfolge von Statics on Thu, 13 May 2010 18:06:33 GMT]]></title><description><![CDATA[<p>Morle schrieb:</p>
<blockquote>
<p>ich will sichergehen, dass diese Variable BEVOR dem ersten Aufruf zum Singelton auf 0 initialisiert wurde)</p>
</blockquote>
<p>Das war glaube ich bei globalen integers garantiert.<br />
<a href="http://www.tilander.org/aurora/2007/10/static-initialization-in-c.html" rel="nofollow">http://www.tilander.org/aurora/2007/10/static-initialization-in-c.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896784</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 13 May 2010 18:06:33 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierungsreihenfolge von Statics on Thu, 13 May 2010 19:05:38 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Morle schrieb:</p>
<blockquote>
<p>ich will sichergehen, dass diese Variable BEVOR dem ersten Aufruf zum Singelton auf 0 initialisiert wurde)</p>
</blockquote>
<p>Das war glaube ich bei globalen integers garantiert.<br />
<a href="http://www.tilander.org/aurora/2007/10/static-initialization-in-c.html" rel="nofollow">http://www.tilander.org/aurora/2007/10/static-initialization-in-c.html</a></p>
</blockquote>
<p>Danke. Das beantwortet meine Frage. Dort steht sinngemäß das alle Variablen initialisiert werden bevor irgendwelche Funktionen aufgerufen werden. Da ich ja eine Funktion aufrufe, ist also die Singeltonvariable vorher mit 0 initialisiert worden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896796</guid><dc:creator><![CDATA[Morle]]></dc:creator><pubDate>Thu, 13 May 2010 19:05:38 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierungsreihenfolge von Statics on Thu, 13 May 2010 19:11:53 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Im übrigen ist ist es garantiert, dass statische Variablen vor der main initialisiert sind.</p>
</blockquote>
<p>Das ist ja das Problem. Es war die Frage in welcher Reihenfolge das geschieht, da ich ja noch bevor die Main überhaupt ausgeführt wird schon ::Instance aufrufen will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896801</guid><dc:creator><![CDATA[Morle]]></dc:creator><pubDate>Thu, 13 May 2010 19:11:53 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierungsreihenfolge von Statics on Thu, 13 May 2010 19:57:45 GMT]]></title><description><![CDATA[<p>Edit: war für dein Problem eher ungeeignet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896812</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Thu, 13 May 2010 19:57:45 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierungsreihenfolge von Statics on Thu, 13 May 2010 20:43:16 GMT]]></title><description><![CDATA[<p>Morle schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Morle schrieb:</p>
<blockquote>
<p>ich will sichergehen, dass diese Variable BEVOR dem ersten Aufruf zum Singelton auf 0 initialisiert wurde)</p>
</blockquote>
<p>Das war glaube ich bei globalen integers garantiert.<br />
<a href="http://www.tilander.org/aurora/2007/10/static-initialization-in-c.html" rel="nofollow">http://www.tilander.org/aurora/2007/10/static-initialization-in-c.html</a></p>
</blockquote>
<p>Danke. Das beantwortet meine Frage. Dort steht sinngemäß das alle Variablen initialisiert werden bevor irgendwelche Funktionen aufgerufen werden. Da ich ja eine Funktion aufrufe, ist also die Singeltonvariable vorher mit 0 initialisiert worden.</p>
</blockquote>
<p>häh...<br />
Ich glaub ich bin blind...<br />
Wo steht &quot;das(s) alle Variablen initialisiert werden bevor irgendwelche Funktionen aufgerufen werden.&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896837</guid><dc:creator><![CDATA[Newbie19]]></dc:creator><pubDate>Thu, 13 May 2010 20:43:16 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierungsreihenfolge von Statics on Thu, 13 May 2010 20:48:56 GMT]]></title><description><![CDATA[<blockquote>
<p>Objects with static storage duration are required by the language to be first zero/constant initialized before anything else happens.</p>
</blockquote>
<p>Du meinst sicherlich diese Passage, aber zero/constant initialized ist doch nicht gleichzusetzen mit initialisiert, oder?</p>
<p>Wenn ich einen Speicherbereich habe, wo ein statisches Objekt rein soll und<br />
es sind erstmal nur 0en drin, dann ist mein Object doch nicht initialisiert?<br />
Für deinen Fall ist das evtl. ausreichend, aber die Verallgemeinerung scheint mir falsch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896838</guid><dc:creator><![CDATA[Newbie19]]></dc:creator><pubDate>Thu, 13 May 2010 20:48:56 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierungsreihenfolge von Statics on Thu, 13 May 2010 20:57:29 GMT]]></title><description><![CDATA[<p>Newbie19 schrieb:</p>
<blockquote>
<blockquote>
<p>Objects with static storage duration are required by the language to be first zero/constant initialized before anything else happens.</p>
</blockquote>
<p>Du meinst sicherlich diese Passage, aber zero/constant initialized ist doch nicht gleichzusetzen mit initialisiert, oder?</p>
</blockquote>
<p>In dem Fall aber ausreichend. Also wenn man Integers, Zeiger etc. auf 0 oder einen compile-time konstanten Ausrduck initialisiert braucht, geht das wunderbar.<br />
Und garantierterweise bevor irgendwelche Funktionen aufgerufen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896844</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 13 May 2010 20:57:29 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierungsreihenfolge von Statics on Thu, 13 May 2010 21:00:41 GMT]]></title><description><![CDATA[<p>Newbie19 schrieb:</p>
<blockquote>
<p>häh...<br />
Ich glaub ich bin blind...<br />
Wo steht &quot;das(s) alle Variablen initialisiert werden bevor irgendwelche Funktionen aufgerufen werden.&quot;?</p>
</blockquote>
<p>Nirgends.<br />
Es geht nur um sowas wie zum Beispiel einen globalen int. Den kannste supi als Flag nehmen, zum Beispiel mit dem alten cout-initialiszer.<br />
Natürlich geht es nicht um Variablen, die Klassenobjekte sind und per Konstruktoraufruf initialisiert werden. <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/1896847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896847</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 13 May 2010 21:00:41 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierungsreihenfolge von Statics on Thu, 13 May 2010 21:13:26 GMT]]></title><description><![CDATA[<p>Danke euch beiden für die Bestätigung!!!</p>
<p>Das mit der 0-Initialisierung ist keine Neuigkeit für mich, ansonsten<br />
hätte man z.B. (teilweise) Probleme mit boost::call_once</p>
<p>Dass diese Garantie in seinem Fall ausreicht, sehe ich ein, ich war nur durch<br />
die Verallgemeinerung iritiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1896853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1896853</guid><dc:creator><![CDATA[Newbie19]]></dc:creator><pubDate>Thu, 13 May 2010 21:13:26 GMT</pubDate></item></channel></rss>