<?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[Zu Beginn initialisieren]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich möchte zu Programmstart bereits einige Funktionspointer in einer Map haben.<br />
Zu diesem Zweck habe ich mir bei Alexandrescu (Modern C++ Design, 8.3<br />
Implementing an Object Factory) folgende Technik abgeschaut:</p>
<pre><code class="language-cpp">bool foo(..,..)
{
  myMap.insert(..,..);
  return true;
}

File.cpp
namespace
{
  const bool nichts = foo(..,..);
}
</code></pre>
<p>Das funktioniert auch bestens, wenn der Code als gewöhnliche Anwendung<br />
compiliert wird.</p>
<p>Gerade habe ich die Anwendung aber als statische Library gebaut (GCC), und<br />
eine Anwendung, die diese Library verwendet, findet eine leere Map vor.<br />
Warum versagt diese Technik bei Libraries?</p>
<p>Danke,</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/291401/zu-beginn-initialisieren</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 19:35:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/291401.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 17 Aug 2011 12:51:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zu Beginn initialisieren on Wed, 17 Aug 2011 12:51:29 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich möchte zu Programmstart bereits einige Funktionspointer in einer Map haben.<br />
Zu diesem Zweck habe ich mir bei Alexandrescu (Modern C++ Design, 8.3<br />
Implementing an Object Factory) folgende Technik abgeschaut:</p>
<pre><code class="language-cpp">bool foo(..,..)
{
  myMap.insert(..,..);
  return true;
}

File.cpp
namespace
{
  const bool nichts = foo(..,..);
}
</code></pre>
<p>Das funktioniert auch bestens, wenn der Code als gewöhnliche Anwendung<br />
compiliert wird.</p>
<p>Gerade habe ich die Anwendung aber als statische Library gebaut (GCC), und<br />
eine Anwendung, die diese Library verwendet, findet eine leere Map vor.<br />
Warum versagt diese Technik bei Libraries?</p>
<p>Danke,</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2107220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2107220</guid><dc:creator><![CDATA[fact]]></dc:creator><pubDate>Wed, 17 Aug 2011 12:51:29 GMT</pubDate></item><item><title><![CDATA[Reply to Zu Beginn initialisieren on Wed, 17 Aug 2011 16:36:15 GMT]]></title><description><![CDATA[<p>Siehe <a href="http://www.c-plusplus.net/forum/282837" rel="nofollow">http://www.c-plusplus.net/forum/282837</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2107309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2107309</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 17 Aug 2011 16:36:15 GMT</pubDate></item><item><title><![CDATA[Reply to Zu Beginn initialisieren on Wed, 17 Aug 2011 17:48:53 GMT]]></title><description><![CDATA[<p>Kurzfassung:</p>
<p>Das Programm mit dem du getestet hast, referenziert vermutlich keine Funktion aus &quot;File.cpp&quot;. Daher verwirft der Linker das ganze &quot;Objekt&quot; (&quot;File.obj&quot;), und die Initialisierung wird nicht ausgeführt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2107344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2107344</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 17 Aug 2011 17:48:53 GMT</pubDate></item><item><title><![CDATA[Reply to Zu Beginn initialisieren on Wed, 17 Aug 2011 21:34:41 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Siehe <a href="http://www.c-plusplus.net/forum/282837" rel="nofollow">http://www.c-plusplus.net/forum/282837</a></p>
</blockquote>
<p>Danke für den Link. So wie es aussieht, kann ich das automatische Registrieren<br />
bei der Factory dann vergessen. Die Tricks, damit das doch läuft, sehen auf-<br />
wändiger aus, als irgendwo ein #include-Monster zu bauen, das alle Klassen<br />
kennt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2107402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2107402</guid><dc:creator><![CDATA[fact]]></dc:creator><pubDate>Wed, 17 Aug 2011 21:34:41 GMT</pubDate></item><item><title><![CDATA[Reply to Zu Beginn initialisieren on Wed, 17 Aug 2011 21:43:26 GMT]]></title><description><![CDATA[<p>Wieso aufwendiger? Du mußt nur dafür sorgen, daß die map vor der ersten Verwendung gefüllt wird - und mit einer lokalen statischen Variable ist das gesichert (im Gegensatz zu globalen Variablen):</p>
<pre><code class="language-cpp">map&lt;..&gt;&amp; getMap()
{
  static map&lt;..&gt; theMap;
  if(theMap.empty())
  {
    //hier alle notwendigen Werte eintragen
  }
  return theMap;
}
</code></pre>
<p>-&gt; Jeder, der die Map verwenden will, muß über diese Funktion zugreifen und erhält ein verwertbares Ergebnis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2107403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2107403</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 17 Aug 2011 21:43:26 GMT</pubDate></item><item><title><![CDATA[Reply to Zu Beginn initialisieren on Wed, 17 Aug 2011 23:06:41 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Wieso aufwendiger? Du mußt nur dafür sorgen, daß die map vor der ersten Verwendung gefüllt wird - und mit einer lokalen statischen Variable ist das gesichert (im Gegensatz zu globalen Variablen):</p>
<pre><code class="language-cpp">map&lt;..&gt;&amp; getMap()
{
  static map&lt;..&gt; theMap;
  if(theMap.empty())
  {
    //hier alle notwendigen Werte eintragen
  }
  return theMap;
}
</code></pre>
<p>-&gt; Jeder, der die Map verwenden will, muß über diese Funktion zugreifen und erhält ein verwertbares Ergebnis.</p>
</blockquote>
<p>Ich habe vorhin nur eine Kurzversion formuliert. Das Ziel ist eine Factory, die<br />
keine Header der zu erzeugenden Klassen einbindet. Das heißt, die Factory weiß<br />
nicht, was sie erzeugt. Stattdessen registriert sich jede zu erzeugende Klasse<br />
beim Programmstart mit einem Paar aus ID und Funktionspointer bei der Factory.</p>
<p>Eine zu erzeugende Klasse MyClass registriert sich z.B. von ihrem *.cpp-File<br />
aus mit dem Macro:</p>
<pre><code class="language-cpp">ALG_REGISTRATION(MYCLASS_ID,MyClass)
</code></pre>
<p>...das so aussieht:</p>
<pre><code>#define ALG_REGISTRATION( atype , algClass ) \
namespace { \
 AlgorithmBasePtr getAlgorithm(..) \
 { \
    return AlgorithmBasePtr(new algClass(..));\
 } \
const bool registered=AFactory::getInstance()-&gt;registerAlgorithm((atype),getAlgorithm); \
}
</code></pre>
<p>Dabei ist die Zeile &quot;const bool registered=...&quot; interessant. Sie registriert<br />
bei der Factory die ID und den zugehörigen Funktionspointer auf getAlgorithm(),<br />
so daß die Factory später nur mit der ID das ihr unbekannte Objekt erzeugen<br />
kann.</p>
<p>Genial, und aus einem Buch von Alexandrescu. Bloß wird eben diese eine Zeile,<br />
die das Registrieren vornimmt, bei der statisch gelinkten Library nicht mehr<br />
ausgeührt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2107420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2107420</guid><dc:creator><![CDATA[fact]]></dc:creator><pubDate>Wed, 17 Aug 2011 23:06:41 GMT</pubDate></item><item><title><![CDATA[Reply to Zu Beginn initialisieren on Thu, 18 Aug 2011 08:32:48 GMT]]></title><description><![CDATA[<p>Pack alle <code>ALG_REGISTRATION()</code> Aufrufe in ein &quot;zentrales&quot; Header File deiner LIB.<br />
Ich hab' immer ein &quot;Common.h&quot; File das dann alle anderen Header-Files einer LIB/EXE als erstes inkludieren. Das wäre ein guter Platz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2107480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2107480</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 18 Aug 2011 08:32:48 GMT</pubDate></item></channel></rss>