<?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[Problem mit Singleton-Objekt]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Frage zu einem Objekt, das mit dem Singleton Pattern erzeugt wird. Es geht um eine Konfigurationsklasse, wobei es von ihr immer nur ein Objekt geben soll. Ich möchte alle meine Konfigurationen ja auch nur in eine Datei speichern.</p>
<p>Das Objekt wird so angelegt:</p>
<pre><code>Configuration* Configuration::getInstance() {
  static Configuration* instance;
  if (instance == NULL) {
    logInfo(&quot;Creating configuration object&quot;);
    instance = new Configuration();
  }
  return instance;
}
</code></pre>
<p>Die Logausgabe wird tatsächlich auch nur ein mal ausgegeben. Das Konfigurationsobjekt hat jetzt ein Attribut vom Typ &quot;std::map&quot;. Da werden Konfigurationselemente mit einem &quot;Key&quot; und dem Zeiger auf das Element hineingeladen.</p>
<p>Zu Beginn meines Programms rufe ich nun auf:</p>
<pre><code>Configuration::getInstance()-&gt;readFromFile(std::string filename)
</code></pre>
<p>Die Map hat jetzt ganz viele Zeiger auf Elemente die mit &quot;new&quot; angelegt wurden.</p>
<p>Alles super, wenn ich direkt eine Zeile danach</p>
<pre><code>Configuration::getInstance()-&gt;saveToFile(std::string filename)
</code></pre>
<p>aufrufe, mit einem anderen Dateinamen als Parameter, habe ich die Datei indirekt kopiert. Laden und Speichern klappt!</p>
<p>Wenn ich nun aber in einem anderen Objekt aus einer ganz anderen Klasse (und in einer anderen .cpp Datei) Konfigurationen verwenden möchte, ist mein Konfigurationsobjekt immer leer! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Wenn ich explizit noch mal die Datei mit</p>
<pre><code>Configuration::getInstance()-&gt;readFromFile(std::string filename)
</code></pre>
<p>in der anderen Klasse einlese, funktioniert es. Das Konfigurationsobjekt existierte aber schon, da die Logausgabe nicht noch mal getätigt wurde!!!</p>
<p>Warum ist meine Konfiguration bei der Benutzung in einem anderen Objekt leer, obwohl ich ein mal &quot;readFromFile&quot; aufgerufen und Konfigurationselemente angelegt habe? <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>Danke danke!</p>
<p>Viele Grüße,<br />
anjohn</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/304451/problem-mit-singleton-objekt</link><generator>RSS for Node</generator><lastBuildDate>Sun, 09 Aug 2026 11:06:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/304451.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 06 Jun 2012 15:17:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Singleton-Objekt on Wed, 06 Jun 2012 15:18:56 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Frage zu einem Objekt, das mit dem Singleton Pattern erzeugt wird. Es geht um eine Konfigurationsklasse, wobei es von ihr immer nur ein Objekt geben soll. Ich möchte alle meine Konfigurationen ja auch nur in eine Datei speichern.</p>
<p>Das Objekt wird so angelegt:</p>
<pre><code>Configuration* Configuration::getInstance() {
  static Configuration* instance;
  if (instance == NULL) {
    logInfo(&quot;Creating configuration object&quot;);
    instance = new Configuration();
  }
  return instance;
}
</code></pre>
<p>Die Logausgabe wird tatsächlich auch nur ein mal ausgegeben. Das Konfigurationsobjekt hat jetzt ein Attribut vom Typ &quot;std::map&quot;. Da werden Konfigurationselemente mit einem &quot;Key&quot; und dem Zeiger auf das Element hineingeladen.</p>
<p>Zu Beginn meines Programms rufe ich nun auf:</p>
<pre><code>Configuration::getInstance()-&gt;readFromFile(std::string filename)
</code></pre>
<p>Die Map hat jetzt ganz viele Zeiger auf Elemente die mit &quot;new&quot; angelegt wurden.</p>
<p>Alles super, wenn ich direkt eine Zeile danach</p>
<pre><code>Configuration::getInstance()-&gt;saveToFile(std::string filename)
</code></pre>
<p>aufrufe, mit einem anderen Dateinamen als Parameter, habe ich die Datei indirekt kopiert. Laden und Speichern klappt!</p>
<p>Wenn ich nun aber in einem anderen Objekt aus einer ganz anderen Klasse (und in einer anderen .cpp Datei) Konfigurationen verwenden möchte, ist mein Konfigurationsobjekt immer leer! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Wenn ich explizit noch mal die Datei mit</p>
<pre><code>Configuration::getInstance()-&gt;readFromFile(std::string filename)
</code></pre>
<p>in der anderen Klasse einlese, funktioniert es. Das Konfigurationsobjekt existierte aber schon, da die Logausgabe nicht noch mal getätigt wurde!!!</p>
<p>Warum ist meine Konfiguration bei der Benutzung in einem anderen Objekt leer, obwohl ich ein mal &quot;readFromFile&quot; aufgerufen und Konfigurationselemente angelegt habe? <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>Danke danke!</p>
<p>Viele Grüße,<br />
anjohn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2220292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2220292</guid><dc:creator><![CDATA[anjohn]]></dc:creator><pubDate>Wed, 06 Jun 2012 15:18:56 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton-Objekt on Wed, 06 Jun 2012 15:23:07 GMT]]></title><description><![CDATA[<p>Verwendest du die Configuration Klasse in einem anderen Singleton (oder statischem Objekt)? Es klingt nämlich ein bisschen so, als würdest du das Objekt vor seiner Erzeugung verwenden. (Die Reihenfolge, in der statische und globale Objekte in den verschiedenen Übersetzungseinheiten initialisiert werden, ist undefiniert.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2220297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2220297</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Wed, 06 Jun 2012 15:23:07 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton-Objekt on Wed, 06 Jun 2012 15:41:13 GMT]]></title><description><![CDATA[<p>Das Problem liegt nicht in den gezeigten Zeilen. ... Liegt die Implementation von <code>getInstance</code> in einem Header oder in einer cpp-Datei?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2220305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2220305</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 06 Jun 2012 15:41:13 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton-Objekt on Thu, 07 Jun 2012 07:20:02 GMT]]></title><description><![CDATA[<p>debugge doch einfach mal, wann die Map geleert wird. Könnte es sein, dass du da vielleicht in SaveToFile einen solchen Seiteneffekt drin hast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2220491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2220491</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Thu, 07 Jun 2012 07:20:02 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton-Objekt on Mon, 11 Jun 2012 11:20:13 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>erst mal Entschuldigung, dass ich so spät antworte. Ich habe den Code immer nur verfügbar wenn ich arbeiten bin. Bin HiWi.</p>
<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Verwendest du die Configuration Klasse in einem anderen Singleton (oder statischem Objekt)? Es klingt nämlich ein bisschen so, als würdest du das Objekt vor seiner Erzeugung verwenden. (Die Reihenfolge, in der statische und globale Objekte in den verschiedenen Übersetzungseinheiten initialisiert werden, ist undefiniert.)</p>
</blockquote>
<p>Das Singleton Objekt wird erst angelegt. Ich bekomme eine Lognachricht dazu. Danach lade ich eine Konfigurationsdatei ein. Dann erstelle ich ein anderes Objekt auf dem Heap und dieses greift dann auf die Konfiguration zu. Das geschieht definitiv nacheinander.</p>
<p>knivil schrieb:</p>
<blockquote>
<p>Das Problem liegt nicht in den gezeigten Zeilen. ... Liegt die Implementation von <code>getInstance</code> in einem Header oder in einer cpp-Datei?</p>
</blockquote>
<p>In einer Cpp-Datei.</p>
<p>daddy_felix schrieb:</p>
<blockquote>
<p>debugge doch einfach mal, wann die Map geleert wird. Könnte es sein, dass du da vielleicht in SaveToFile einen solchen Seiteneffekt drin hast?</p>
</blockquote>
<p>Joa, muss ich wohl <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2221978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2221978</guid><dc:creator><![CDATA[anjohn]]></dc:creator><pubDate>Mon, 11 Jun 2012 11:20:13 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton-Objekt on Mon, 11 Jun 2012 12:09:16 GMT]]></title><description><![CDATA[<p>Also erst mache ich sowas in der Main-Methode:</p>
<pre><code>Configuration::getInstance()-&gt;readFromFile(&quot;autosave.ncfg&quot;);

Configuration* config = Configuration::getInstance();
ConfigurationSection* cfgsection = config-&gt;getSection(&quot;Classifier0&quot;);

logInfo(&quot;nRefColors in Main: %d&quot;,(int)cfgsection-&gt;getElement(&quot;nRefColors&quot;)-&gt;getValueAsLonglong(0, &quot;&quot;));
</code></pre>
<p>Jetzt steht in meinem Logfile, dass das Element &quot;nRefColors&quot; eine 1 enthält!</p>
<p>Dann gehts weiter:</p>
<pre><code>pVision = new Vision(optCam, angleCallback);
pVision-&gt;loadConfig(cfg);
</code></pre>
<p>Im pVision-Objekt wird dann wieder ein neues Objekt erzeugt:</p>
<pre><code>for (unsigned int i = 0; i &lt; NCAMS; i++) {
  // Cam index - swapping cameras here if necessary.
  const unsigned int c = camSwap ? (1 - i) : (i);
  pCamStates[i] = NULL;
  pRGBFilter[i] = new RGBFilter(i);
  ...
</code></pre>
<p>Das pVision-Objekt gibt nun den loadConfig-Aufruf an meine pRGBFilter-Objekte weiter:</p>
<pre><code>void RGBFilter::loadSettings(ConfigTools* cfg,const char* section) {
  stringstream key;
  key &lt;&lt; &quot;Classifier&quot; &lt;&lt; sectionNumber;
  //Configuration::getInstance()-&gt;readFromFile(&quot;autosave.ncfg&quot;);
  Configuration* config = Configuration::getInstance();
  ConfigurationSection* cfgsection = config-&gt;getSection(key.str());

  params.nRefColors = (int)cfgsection-&gt;getElement(&quot;nRefColors&quot;)-&gt;getValueAsLonglong(0, &quot;&quot;);
  logInfo(&quot;RefColors = %d&quot;, params.nRefColors);
  ...
</code></pre>
<p>Jetzt gibt die Logausgabe aber den Defaultwert zurück, nämlich 0. Wenn ich den auskommentierten readFromFile-Aufruf wieder einbinde, funktioniert alles wie erwartet.</p>
<p>Intern arbeitet meine Konfigurationsklasse mit Maps. Mein Chef hat mich darauf hingewiesen, dass ich mich später in einer anderen Übersetzungseinheit befinde. Ich soll mich mal schlau machen, ob es an den Maps bzw. daran liegt, wie mit ihr Keys verglichen werden.</p>
<p>Ich habe bis jetzt solche maps:</p>
<pre><code>map&lt;string, ConfigurationSection*&gt; sectionMap;
map&lt;string, ConfigurationElement*&gt; elementMap;
</code></pre>
<p>Und ich vergleiche nicht vorhandene Objekte so:</p>
<pre><code>ConfigurationElement* ConfigurationSection::getElement(string key) {
  if (elementMap[key] == NULL) {
    elementMap[key] = new ConfigurationElement(key,this);
  }
  return elementMap[key];
}
</code></pre>
<p>Könnte das an dem internen Vergleich der Map liegen, dass in einer anderen Übersetzungseinheit der getElement-Aufruf den Eintrag in der Map nicht mehr findet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2221987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2221987</guid><dc:creator><![CDATA[anjohn]]></dc:creator><pubDate>Mon, 11 Jun 2012 12:09:16 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton-Objekt on Mon, 11 Jun 2012 13:11:39 GMT]]></title><description><![CDATA[<p>anjohn schrieb:</p>
<blockquote>
<pre><code>ConfigurationElement* ConfigurationSection::getElement(string key) {
  if (elementMap[key] == NULL) {
    elementMap[key] = new ConfigurationElement(key,this);
  }
  return elementMap[key];
}
</code></pre>
</blockquote>
<p>Das wird nicht funktionieren. Ein Pointer, dem man nichts zugewiesen hat, ist nicht zwangsläufig ein Nullpointer, sondern er kann überall hinzeigen. map hat aber eine find-Funktion zum Überprüfen, ob es einen Eintrag schon gibt.</p>
<p>Kann es sein, dass du aus der Java-Ecke kommst? Implizite Nullzeiger und dann überall dieses Pointergefrickel mit <code>new</code> . Lass doch einfach mal überall die Pointer und vor allem die <code>new</code> -Aufrufe weg. Und wenn du schon dabei bist, lass auch noch das Singleton weg. Wenn du nur ein Objekt brauchst, dann erstell auch nur ein Objekt. Kein Grund gleich zu verhindern, dass mehrere Objekte erstellt werden können. Manchmal braucht man sogar noch nicht mal ein Objekt, sondern eine freie Funktion reicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2222006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2222006</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Mon, 11 Jun 2012 13:11:39 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton-Objekt on Mon, 11 Jun 2012 13:30:11 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Kann es sein, dass du aus der Java-Ecke kommst? Implizite Nullzeiger und dann überall dieses Pointergefrickel mit <code>new</code> . Lass doch einfach mal überall die Pointer und vor allem die <code>new</code> -Aufrufe weg. Und wenn du schon dabei bist, lass auch noch das Singleton weg.</p>
</blockquote>
<p>Naja, ich setze gerade nur eine Schnittstelle um. Die Schnittstelle wurde von einem Javaprogrammierer erstellt. Ich habe vor Jahren auch mal Java gelernt, aber mache seit längerer Zeit C++.</p>
<p>Das mit &quot;find&quot; habe ich umgesetzt. Es hilft mir leider nicht. Auch konnte ich diesem Fehler in einem kleinen Testprogramm nicht reproduzieren. Ich bin wirklich verzweifelt. Debuggen lassen sich solche Maps auch nicht so knorke (zumindest in Netbeans). <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Ich persönlich hätte die ganze Konfigurationsgeschichte am liebsten komplett statisch entworfen. Also wirklich ohne Objekte die ich als Benutzer instanziieren muss.</p>
<p>Ich habe keine Ahnung, an welcher Stelle plötzlich nichts mehr in meinen Maps steht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2222020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2222020</guid><dc:creator><![CDATA[anjohn]]></dc:creator><pubDate>Mon, 11 Jun 2012 13:30:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton-Objekt on Mon, 11 Jun 2012 14:35:33 GMT]]></title><description><![CDATA[<p>Ich habe mich mühseelig mit Logging bis zum Ursprung des Fehlers zurückgehangelt. Ich muss sagen, dass dieser Fehler das Abgefahrendste ist, was mir je untergekommen ist.</p>
<p>Ich erzeuge meine Config. Dann erzeuge ich ein neues Objekt A. Das Objekt A erzeugt wieder ein neues Objekt B.</p>
<p>Im Konstruktor von Objekt B rufe ich meine getValue-Funktion auf, alles ok. Dann rufe ich diese Funktion erneut auf und bekomme einen richtigen Wert. Der interne Wert meines Konfigurationselements steht aber plötzlich auf 0. Ich rufe getValue ein drittes mal auf und bekomme 0 zurück, was Sinn macht, da intern im Konfigurationsobjekt eine 0 gespeichert wurde.</p>
<p>Wie kann das denn?????</p>
<pre><code>long long ConfigurationElement::getValueAsLonglong(long long defaultValue, string _comment) {
  stringstream ss;
  long long output;

  if (value == &quot;&quot;) {
    ss &lt;&lt; defaultValue;
    ss &gt;&gt; value;
    comment = _comment;
  }

  ss.str(value);
  ss &gt;&gt; output;
  return output;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2222073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2222073</guid><dc:creator><![CDATA[anjohn]]></dc:creator><pubDate>Mon, 11 Jun 2012 14:35:33 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton-Objekt on Mon, 11 Jun 2012 15:15:05 GMT]]></title><description><![CDATA[<p>Deine Ausführungen machen mir den Codeablauf noch nicht klar. Auch weiß ich nicht, warum eine <strong>get</strong>-Funktion einen Default-Wert und einen Kommentar als Parameter bekommt. Aber wenn du doch schon die genaue Stelle kennst, an der dein Fehler auftritt, dann kannst du wunderbar debuggen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2222097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2222097</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Mon, 11 Jun 2012 15:15:05 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Singleton-Objekt on Tue, 12 Jun 2012 06:21:55 GMT]]></title><description><![CDATA[<p>Ich denke mal, dass im Falle eines leeren values das Fehlerflag beim Stream gesetzt ist. Ruf einfach ss.clear() vor ss.str(value); auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2222243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2222243</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 12 Jun 2012 06:21:55 GMT</pubDate></item></channel></rss>