<?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 map&amp;lt;string, singleton*&amp;gt; als Singleton-Registry crasht beim bevölkern]]></title><description><![CDATA[<p>Hallo alle.</p>
<p>Frei nach gang of four hab ich eine Singleton Klasse implementiert, die eine registry für Subklassen benutzt. Konkret gehts um Netzwerke (im Sinn von Graphen), daher sieht die abstrakte Basisklasse so aus, reduziert aufs wesentliche:</p>
<p>Header:</p>
<pre><code class="language-cpp">class network {
      public:
      virtual ~network();

      static network * instance();
      static void registerNetworkSubclass(string s, network * newNet);

      protected:
      network();
      static network * lookupNetworkSubclass(const string&amp; name);

      private:
      static network * networkInstance;
      static map&lt;string, network*&gt; theNetworkRegistry;

      virtual void buildNetworkToSpecification() = 0;
};
</code></pre>
<p>Implementierung:</p>
<pre><code class="language-cpp">network * network::networkInstance = 0;
map&lt;string, network*&gt; network::theNetworkRegistry;

network * network::instance(){
        if(!networkInstance){
            string networkSubclassName = &quot;ERNetwork&quot;; // &lt;- soll später durch user input festgelegt werden
            networkInstance = network::lookupNetworkSubclass(networkSubclassName);
        }
        return networkInstance;
}

void network::registerNetworkSubclass(string newString, network* newNet){
     network::theNetworkRegistry[newString] = newNet;
}

network * network::lookupNetworkSubclass(const string&amp; name){
     //note: if 'name' is not recognized, a new map entry will be created containing (name, 0 (default pointer value))
     return theNetworkRegistry[name];
}
</code></pre>
<p>So weit so gut. Eine abgeleitete Klasse (für Erdös-Renyi Graphen) sieht so aus:<br />
Header:</p>
<pre><code class="language-cpp">class ERNetwork : public network{

      public:
      ERNetwork();
      ~ERNetwork();

      private:
      void buildNetworkToSpecification();
};
</code></pre>
<p>Implementierung:</p>
<pre><code class="language-cpp">static ERNetwork theERInstance; //&lt;- eine static instanz der subklasse, damit sie sich via konstruktor registiert

ERNetwork::ERNetwork() : network(){
        network::registerNetworkSubclass(&quot;ERNetwork&quot;, this);
}

ERNetwork::~ERNetwork(){}
</code></pre>
<p>Wenn ich jetzt mein Programm starte, wird die statische Instanz der Subklasse erzeugt, die sich daraufhin registrieren will. Innerhalb der Funktion 'network::registerNetworkSubclass' schmiert das Programm mit einer Speicherzugriffsverletzung ab (glaub ich - unter Windows sehen diese Fehlerwindows alle gleich aus), wenn ich das neue (name, network*) Paar hinzufügen will.</p>
<p>Gibt es eine Besonderheit mit maps als statische objekte, oder was mach ich falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/213919/static-map-lt-string-singleton-gt-als-singleton-registry-crasht-beim-bevölkern</link><generator>RSS for Node</generator><lastBuildDate>Tue, 13 Oct 2026 20:51:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/213919.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 23 May 2008 12:48:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to static map&amp;lt;string, singleton*&amp;gt; als Singleton-Registry crasht beim bevölkern on Fri, 23 May 2008 12:48:29 GMT]]></title><description><![CDATA[<p>Hallo alle.</p>
<p>Frei nach gang of four hab ich eine Singleton Klasse implementiert, die eine registry für Subklassen benutzt. Konkret gehts um Netzwerke (im Sinn von Graphen), daher sieht die abstrakte Basisklasse so aus, reduziert aufs wesentliche:</p>
<p>Header:</p>
<pre><code class="language-cpp">class network {
      public:
      virtual ~network();

      static network * instance();
      static void registerNetworkSubclass(string s, network * newNet);

      protected:
      network();
      static network * lookupNetworkSubclass(const string&amp; name);

      private:
      static network * networkInstance;
      static map&lt;string, network*&gt; theNetworkRegistry;

      virtual void buildNetworkToSpecification() = 0;
};
</code></pre>
<p>Implementierung:</p>
<pre><code class="language-cpp">network * network::networkInstance = 0;
map&lt;string, network*&gt; network::theNetworkRegistry;

network * network::instance(){
        if(!networkInstance){
            string networkSubclassName = &quot;ERNetwork&quot;; // &lt;- soll später durch user input festgelegt werden
            networkInstance = network::lookupNetworkSubclass(networkSubclassName);
        }
        return networkInstance;
}

void network::registerNetworkSubclass(string newString, network* newNet){
     network::theNetworkRegistry[newString] = newNet;
}

network * network::lookupNetworkSubclass(const string&amp; name){
     //note: if 'name' is not recognized, a new map entry will be created containing (name, 0 (default pointer value))
     return theNetworkRegistry[name];
}
</code></pre>
<p>So weit so gut. Eine abgeleitete Klasse (für Erdös-Renyi Graphen) sieht so aus:<br />
Header:</p>
<pre><code class="language-cpp">class ERNetwork : public network{

      public:
      ERNetwork();
      ~ERNetwork();

      private:
      void buildNetworkToSpecification();
};
</code></pre>
<p>Implementierung:</p>
<pre><code class="language-cpp">static ERNetwork theERInstance; //&lt;- eine static instanz der subklasse, damit sie sich via konstruktor registiert

ERNetwork::ERNetwork() : network(){
        network::registerNetworkSubclass(&quot;ERNetwork&quot;, this);
}

ERNetwork::~ERNetwork(){}
</code></pre>
<p>Wenn ich jetzt mein Programm starte, wird die statische Instanz der Subklasse erzeugt, die sich daraufhin registrieren will. Innerhalb der Funktion 'network::registerNetworkSubclass' schmiert das Programm mit einer Speicherzugriffsverletzung ab (glaub ich - unter Windows sehen diese Fehlerwindows alle gleich aus), wenn ich das neue (name, network*) Paar hinzufügen will.</p>
<p>Gibt es eine Besonderheit mit maps als statische objekte, oder was mach ich falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1515131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1515131</guid><dc:creator><![CDATA[Daniel der Gast]]></dc:creator><pubDate>Fri, 23 May 2008 12:48:29 GMT</pubDate></item><item><title><![CDATA[Reply to static map&amp;lt;string, singleton*&amp;gt; als Singleton-Registry crasht beim bevölkern on Fri, 23 May 2008 13:00:54 GMT]]></title><description><![CDATA[<p>network::theNetworkRegistry muss initialisiert werden, bevor theERInstance initialisiert wird. Falls du richtigerweise beide Objekte in verschiedenen ÜEs definiert hast, ist die Reihenfolge ihrer Initialisierung aber unspezifiziert. Die einfachste Lösung dürfte wohl sein, network::theNetworkRegistry durch eine entsprechende FUnktion zu ersetzen, die bei Bedarf initialisiert, also</p>
<pre><code class="language-cpp">static map&lt;string, network*&gt;&amp; registry() {
    static map&lt;string, network*&gt; registry;
    return registry;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1515142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1515142</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 23 May 2008 13:00:54 GMT</pubDate></item><item><title><![CDATA[Reply to static map&amp;lt;string, singleton*&amp;gt; als Singleton-Registry crasht beim bevölkern on Fri, 23 May 2008 13:09:29 GMT]]></title><description><![CDATA[<p>Ah, tricky.</p>
<p>Danke für die schnelle Antwort!</p>
<p>Auf zum nächsten Crash... aber ich versuch mich erst selbst dran, bevor ich weiterfrage.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1515153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1515153</guid><dc:creator><![CDATA[Daniel der Gast]]></dc:creator><pubDate>Fri, 23 May 2008 13:09:29 GMT</pubDate></item><item><title><![CDATA[Reply to static map&amp;lt;string, singleton*&amp;gt; als Singleton-Registry crasht beim bevölkern on Fri, 23 May 2008 13:23:50 GMT]]></title><description><![CDATA[<p>Ok, ich kriegs immer noch nicht gebacken.</p>
<p>Mit campers Variante funktioniert mein Programm jetzt so weit dass sich alle (zwei) Subklassen mittels ihrer jeweiligen static Instanzen registrieren, ABER die registry ist nicht persistent... wenn ich versuche, auf die map zuzugreifen, ist sie immer wieder leer. Sowohl wenn sich eine zweite Subklasse registriert, als auch wenn ich im Hauptprogramm per instance() auf mein (unique) network zugreifen will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1515157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1515157</guid><dc:creator><![CDATA[Daniel der Gast]]></dc:creator><pubDate>Fri, 23 May 2008 13:23:50 GMT</pubDate></item><item><title><![CDATA[Reply to static map&amp;lt;string, singleton*&amp;gt; als Singleton-Registry crasht beim bevölkern on Fri, 23 May 2008 16:31:45 GMT]]></title><description><![CDATA[<p>Mein Fehler:</p>
<p>Man sollte besser schreiben</p>
<p>void network::registerNetworkSubclass(string newString, network* newNet){<br />
map&lt;string, network*&gt;<strong>&amp;</strong> reg = network::registry();<br />
reg[newString] = newNet;<br />
}</p>
<p>anstelle von</p>
<p>void network::registerNetworkSubclass(string newString, network* newNet){<br />
map&lt;string, network*&gt; reg = network::registry();<br />
reg[newString] = newNet;<br />
}</p>
<p>da man sonst immer nur auf einer lokalen Kopie die Schlüsseleinträge hinzufügt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1515262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1515262</guid><dc:creator><![CDATA[Daniel der Gast]]></dc:creator><pubDate>Fri, 23 May 2008 16:31:45 GMT</pubDate></item></channel></rss>