<?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[Singleton vs unnamed namespace]]></title><description><![CDATA[<p>Hi,</p>
<p>Inspiriert zu diesem Thread hat mich dieser teilweise verwandte Thread <a href="http://www.c-plusplus.net/forum/285025" rel="nofollow">http://www.c-plusplus.net/forum/285025</a><br />
Aber hier sticht mir noch ein Spezialfall besonders ins Auge.</p>
<p>Diese unnamed namespaces schwirren mir ständig im Kopf rum, genau so wie freie Funktionen. Alles in Klassen zu packen hat Java-Konsequenz, die aber in C++ keine Anwendung findet. Das habe ich erst kürzlich gelernt und mein Stil hat das alles andere als gefressen und erst Recht habe ich daraus noch kein allgemeines Procedere für mich abgeleitet.</p>
<p>Folgende Aspekte scheinen für die Wahl von freien Funktionen/unnamed Namespace/Singleton oder direkt Klasse wichtig zu sein:</p>
<ol>
<li>Soll die Klasse überhaupt mehrfach instanziiert werden?</li>
<li>Gibt es die Notwendigkeit etwas zu kapseln?</li>
<li>Möchte man Vererbung (evtl. i.V.m. Polymorphie) nutzen?</li>
</ol>
<p>Hm, eigentlich reicht das schon fast, oder?</p>
<p>Wenn man mehrere Instanzen braucht, machen gewöhnliche Klassen schon automatisch Sinn.</p>
<p>Doch wenn nicht, machen Singletons für mich aber gerade überhaupt keinen Sinn mehr in C++. Man nutzt diese, wenn man global nur eine einzige Instanz der Klasse haben möchte. Doch sollte es dann überhaupt noch eine Klasse sein, wozu?</p>
<p>Wenn man etwas kapseln möchte, kann man das auch in den unnamed namespace schieben. Problematisch ist natürlich, wenn man so lustige Konzepte wie Laufzeit- oder statische Polymorphie nutzen möchte. Aber das macht für Singletons sowieso keinen Sinn, richtig? Sonst hätte man für jede Kombination aus Templateparametern ein neues Singleton. Da fällt mir auf Anhieb kein Fall ein, wo das Sinn macht.</p>
<p>Und Vererbung? Durch die Vererbung von Singletons erstellt man automatisch neue Klassen und damit Instanzen. Das halte ich auch nur begrenzt für sinnvoll.</p>
<p>Die nächste Frage ist dann, ob unnamed namespaces irgendwelche Nachteile ggü. Singleton-Klassen haben, gerade was die Benutzung angeht. Gut ist, dass man keine lästige Zugriffsmethode mehr braucht, um die einzige Instanz zu erhalten. Außerdem wird keinem Benutzer vorgegaukelt, eine Mehrfachinstanziierung sei möglich, da es eben keine Klasse mehr ist.</p>
<p>Nachteil wäre, dass man freie Funktionen aufrufen muss. Wenn man als Programmierer z.B. schon ein <em>Objekt</em> im Sinn hat wie irgendeine zentrale Verwaltungseinheit, dann ist natürlich ein Aufruf:</p>
<pre><code class="language-cpp">CentralManagementUnit.AcquireVeryBigDonuts();
</code></pre>
<p>intuitiv. Oder sollte es den Benutzer nicht interessieren, dass so eine Verwaltungseinheit irgendwo rumliegt, sondern einfach schreiben, was er möchte?</p>
<pre><code class="language-cpp">acquireVeryBigDonuts();
</code></pre>
<p>Dann gäbe es noch die Möglichkeit eines benannten namespaces:</p>
<pre><code class="language-cpp">// Header
namespace CentralManagementUnit
{
    // Irgendwelche Funktionen
};

// C++

namespace
{
    // Gekapselte Attribute, private Funktionen etc.
}

namespace CentralManagementUnit
{
    // Funktionsimplementierungen
}
</code></pre>
<p>Was sollte man jetzt wofür nehmen und wieso? Habt ihr da Favoriten, gibt es überwältigende Argumente, hat man in euren Augen keine Unterschiede zwischen Singleton und unnamed namespace oder was denkt ihr sonst zu dem Thema?</p>
<p>Discuss! <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/topic/285027/singleton-vs-unnamed-namespace</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 17:00:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285027.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 13 Apr 2011 07:35:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 07:38:58 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Inspiriert zu diesem Thread hat mich dieser teilweise verwandte Thread <a href="http://www.c-plusplus.net/forum/285025" rel="nofollow">http://www.c-plusplus.net/forum/285025</a><br />
Aber hier sticht mir noch ein Spezialfall besonders ins Auge.</p>
<p>Diese unnamed namespaces schwirren mir ständig im Kopf rum, genau so wie freie Funktionen. Alles in Klassen zu packen hat Java-Konsequenz, die aber in C++ keine Anwendung findet. Das habe ich erst kürzlich gelernt und mein Stil hat das alles andere als gefressen und erst Recht habe ich daraus noch kein allgemeines Procedere für mich abgeleitet.</p>
<p>Folgende Aspekte scheinen für die Wahl von freien Funktionen/unnamed Namespace/Singleton oder direkt Klasse wichtig zu sein:</p>
<ol>
<li>Soll die Klasse überhaupt mehrfach instanziiert werden?</li>
<li>Gibt es die Notwendigkeit etwas zu kapseln?</li>
<li>Möchte man Vererbung (evtl. i.V.m. Polymorphie) nutzen?</li>
</ol>
<p>Hm, eigentlich reicht das schon fast, oder?</p>
<p>Wenn man mehrere Instanzen braucht, machen gewöhnliche Klassen schon automatisch Sinn.</p>
<p>Doch wenn nicht, machen Singletons für mich aber gerade überhaupt keinen Sinn mehr in C++. Man nutzt diese, wenn man global nur eine einzige Instanz der Klasse haben möchte. Doch sollte es dann überhaupt noch eine Klasse sein, wozu?</p>
<p>Wenn man etwas kapseln möchte, kann man das auch in den unnamed namespace schieben. Problematisch ist natürlich, wenn man so lustige Konzepte wie Laufzeit- oder statische Polymorphie nutzen möchte. Aber das macht für Singletons sowieso keinen Sinn, richtig? Sonst hätte man für jede Kombination aus Templateparametern ein neues Singleton. Da fällt mir auf Anhieb kein Fall ein, wo das Sinn macht.</p>
<p>Und Vererbung? Durch die Vererbung von Singletons erstellt man automatisch neue Klassen und damit Instanzen. Das halte ich auch nur begrenzt für sinnvoll.</p>
<p>Die nächste Frage ist dann, ob unnamed namespaces irgendwelche Nachteile ggü. Singleton-Klassen haben, gerade was die Benutzung angeht. Gut ist, dass man keine lästige Zugriffsmethode mehr braucht, um die einzige Instanz zu erhalten. Außerdem wird keinem Benutzer vorgegaukelt, eine Mehrfachinstanziierung sei möglich, da es eben keine Klasse mehr ist.</p>
<p>Nachteil wäre, dass man freie Funktionen aufrufen muss. Wenn man als Programmierer z.B. schon ein <em>Objekt</em> im Sinn hat wie irgendeine zentrale Verwaltungseinheit, dann ist natürlich ein Aufruf:</p>
<pre><code class="language-cpp">CentralManagementUnit.AcquireVeryBigDonuts();
</code></pre>
<p>intuitiv. Oder sollte es den Benutzer nicht interessieren, dass so eine Verwaltungseinheit irgendwo rumliegt, sondern einfach schreiben, was er möchte?</p>
<pre><code class="language-cpp">acquireVeryBigDonuts();
</code></pre>
<p>Dann gäbe es noch die Möglichkeit eines benannten namespaces:</p>
<pre><code class="language-cpp">// Header
namespace CentralManagementUnit
{
    // Irgendwelche Funktionen
};

// C++

namespace
{
    // Gekapselte Attribute, private Funktionen etc.
}

namespace CentralManagementUnit
{
    // Funktionsimplementierungen
}
</code></pre>
<p>Was sollte man jetzt wofür nehmen und wieso? Habt ihr da Favoriten, gibt es überwältigende Argumente, hat man in euren Augen keine Unterschiede zwischen Singleton und unnamed namespace oder was denkt ihr sonst zu dem Thema?</p>
<p>Discuss! <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/2048471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048471</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Wed, 13 Apr 2011 07:38:58 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 07:43:49 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Doch wenn nicht, machen Singletons für mich aber gerade überhaupt keinen Sinn mehr in C++.</p>
</blockquote>
<p>Singletons können den Erzeugungszeitpunkt hinauszögern. Dann wartet man z.B. 500ms beim ersten Aufruf des Drucken-Dialogs und nicht wie beim Acrobat-Reader 30 Sekunden bei Programmstart auf alle Singletons auf einmal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048475</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 13 Apr 2011 07:43:49 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 08:00:05 GMT]]></title><description><![CDATA[<p>Du kannst ein Singleton mittels freier Funktionen implementieren. Wer sagt denn, dass ein Singleton immer mit <code>singleton::get_instance()</code> arbeiten muss?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048487</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 13 Apr 2011 08:00:05 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 08:31:57 GMT]]></title><description><![CDATA[<p>Hm. Ok. Mehr Gedanken habt ihr nicht dazu? Das Thema las ich bisher nicht umfassend diskutiert, ist meine Frage so trivial? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2048503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048503</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Wed, 13 Apr 2011 08:31:57 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 08:37:10 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Hm. Ok. Mehr Gedanken habt ihr nicht dazu? Das Thema las ich bisher nicht umfassend diskutiert, ist meine Frage so trivial? <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>
</blockquote>
<p>Ich weiß nicht, was hier anders ist als im anderen Thread. Deine Frage war für mich nicht konkreter, sondern schwammiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048505</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 13 Apr 2011 08:37:10 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 08:51:15 GMT]]></title><description><![CDATA[<p>Das andere Thema war &quot;namespace vs Klassen&quot; und hier bin ich &quot;Singleton vs unnamed namespaces&quot;, rein vom Titel her bin ich hier schon konkreter. Konkret ist meine Frage nicht, aber ich hätte gedacht, da haben viele Gedanken zu von wegen:</p>
<p><em>Jaa, also ich mache das immer so, dass ich Singletons fast nie als Klassen benutze, sondern immer namespaces nutze, außer [...]. Und sonst haben unnamed namespaces halt den Vorteil, dass [...], wohingegen...</em></p>
<p>Aber anscheinend gibt es zu dem Thema nix in der Richtung, schade.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048511</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048511</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Wed, 13 Apr 2011 08:51:15 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 08:57:40 GMT]]></title><description><![CDATA[<p>Jaa, also ich mache das immer so, dass ich Singletons fast nie benutze und globale Variablen (auch in unnamed namespaces) auch nicht.</p>
<p>Mußt einen Uhrumlauf abwarten vor einem Fazit. Viele sind jetzt in der Schule oder arbeiten und dürfen gar nicht mitreden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048519</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048519</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 13 Apr 2011 08:57:40 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 09:11:34 GMT]]></title><description><![CDATA[<p>Und wenn man ein Objekt nur einmal braucht, sodass freie Funktionen sich anbieten würde, es aber etwas gibt, dass man kapseln möchte? Entweder nimmt man eine Singleton-Klasse oder eine globale Variable in einem unnamed namespace.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048543</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Wed, 13 Apr 2011 09:11:34 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 09:14:34 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Und wenn man ein Objekt nur einmal braucht, sodass freie Funktionen sich anbieten würde, es aber etwas gibt, dass man kapseln möchte? Entweder nimmt man eine Singleton-Klasse oder eine globale Variable in einem unnamed namespace.</p>
</blockquote>
<p>Ja, sehe ich auch so.</p>
<p>Halt, manchmal erzeuge ich Einmal-Objekte auch in der main() und reiche sie zum Benutzer runter.<br />
Oder das klassische</p>
<pre><code class="language-cpp">int main(){
   World w;
   return w.run();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2048544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048544</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 13 Apr 2011 09:14:34 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 09:17:41 GMT]]></title><description><![CDATA[<p>Und was benutzt Du dann von beiden Varianten lieber?</p>
<p>Also verbietest Du Mehrfachinstanziierung von Einmal-Objekten nicht? Ich habe aber manchmal das Problem, dass ich Systemfunktionen aufrufe, die nicht mehrfach aufgerufen werden sollen, sodass Mehrfachinstanziierung also böse ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048548</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Wed, 13 Apr 2011 09:17:41 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 09:30:36 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Und was benutzt Du dann von beiden Varianten lieber?</p>
</blockquote>
<p>Das hängt ganz stark vom Problem ab, dass man hat. Es gibt ja gerade in C++ auch nicht <em>die</em> Singleton-Lösung, sondern diverse Geschmacksrichtungen, welche unterschiedliche Probleme lösen sollen.<br />
Insbesonderes zur Behandlung von Race Conditions bei der Singleton-Dekonstruktion gibt es ziemlich viele Ansätze, wobei Einer häßlicher als der Andere ist.<br />
Und je nachdem, was man für ein Singleton haben will, bietet es sich entweder an, dies über freie Funktionen oder über Klassen zu realisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048554</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 13 Apr 2011 09:30:36 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 09:33:07 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Und was benutzt Du dann von beiden Varianten lieber?<br />
Also verbietest Du Mehrfachinstanziierung von Einmal-Objekten nicht?</p>
</blockquote>
<p>Normalerweise nicht. Im nächsten Programm will ich zwei Welten haben. Oder zwei Drucker.</p>
<p>Eisflamme schrieb:</p>
<blockquote>
<p>Ich habe aber manchmal das Problem, dass ich Systemfunktionen aufrufe, die nicht mehrfach aufgerufen werden sollen, sodass Mehrfachinstanziierung also böse ist.</p>
</blockquote>
<p>Ja, dann muß ich es verbieten.<br />
Aber ich habe keine Faustregel, ob ich Singleton oder globale Variable im anonymen namesdpace bevorzuge. Wobei die beiden sogar dasselbe sind, wenn ich die freie ReadOnly-Zugriffsfunktion mitanbiete.<br />
Der wichtigste Unterschied ist wohl, ob ich eine static lokale Variable oder static globale Variable nehmen will. Ob ich dann</p>
<pre><code class="language-cpp">CentralManagementUnit.AcquireVeryBigDonuts();
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">CentralManagementUnitAcquireVeryBigDonuts();
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">CentralManagementUnit::AcquireVeryBigDonuts();
</code></pre>
<p>anbiete, hängt glaube ich von der aktuellen relativen Mondfeuchtigkeit ab. Da entwickelt sich bei mir kein absolute statement dazu, weil es so selten vorkommt, und ich jedes Jahr irgendwie anders drauf bin.<br />
Es gibt außerdem übliches Vorgehen: theApp ist global und nicht static in der main.cpp, theWorld lokal und nicht static in der main(), Hilfstabellen zum Speichermanager sind dort im anonymous namespace also global und static, der Systemdrucker ist ein Meyers-Singleton also lokal und static, die Winsock-DLL hat die Tendenz dazu, im anonymous namespace der Socket.cpp zu liegen also lokal und static, kann aber auch durchgereicht werden also lokal und nicht static.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048557</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 13 Apr 2011 09:33:07 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 09:55:03 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Und wenn man ein Objekt nur einmal braucht [...]</p>
</blockquote>
<p>Wenn man nur ein Objekt eines Typs braucht bedeutet das noch lange nicht dass das Singleton Pattern angebracht ist. Leider ist das nur wie die meisten das Singleton Pattern einsetzen. Das ist aber schlicht und einfach <em>falsch</em>. Der Zweck des Singleton Pattern ist es um jeden Preis sicherzustellen dass in keinem Fall niemals und überhaupt mehr als ein Objekt eines Typs erzeugt wird. Mit dem Singleton Pattern drückst du aus dass es eine Eigenschaft des Typs ist dass er nur einmal instanziert werden <em>kann</em>. Die Tatsache dass du beim Singleton üblicherweise einen globalen Zugriffspunkt auf die eine Instanz hast ist lediglich eine Folge aber <em>nicht der Zweck</em> des Singleton Pattern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048569</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 13 Apr 2011 09:55:03 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 10:37:03 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Eisflamme schrieb:</p>
<blockquote>
<p>Und was benutzt Du dann von beiden Varianten lieber?<br />
Also verbietest Du Mehrfachinstanziierung von Einmal-Objekten nicht?</p>
</blockquote>
<p>Normalerweise nicht. Im nächsten Programm will ich zwei Welten haben. Oder zwei Drucker.</p>
</blockquote>
<p>Muss sagen, das argument verstehe ich irgendwie nie so richtig. Normalerweise ist es einfacher ein Programm so zu schreiben, dass es von bestimmten Dingen nur eines gibt, weil man halt nur einen Fall prüfen muss. D.h. wenn ich mein Programm nur auf eine &quot;Welt&quot; auslege, kann ich eben nicht eine zweite einfach erstellen und das wird dann schon alles gutgehen. Entweder also programmierst du von Anfang an so das du x Welten erwartest, und machst dir falls du es nie braucht völlig unnötige Arbeit, oder aber du erlaubst es ein Objekt zu kopieren das logisch gesehen eben nicht kopiert werden darf.</p>
<p>Ein Objekt das singleton ist mehrfach zu erlauben ist erstmal ne sehr einfach aufgabe.. Konstruktor public, getInstance oder so weg, dann variable global machen (oder aber auf dependency injection umstellen wenn man will). Aufrufe noch korrigieren und fertig. Dass das ganze mit einer dann tatsächlich zweiten Instanz des ehemaligen Singletons dann noch logisch funktioniert ist die interessantere und deutlich schwierigere frage. Wenn die beiden Welten nämlich tatsächlich vollständig unabhängig voneinander wären, könnte ich das programm ja einfach 2 mal starten. Da hat dot irgendwie recht, nur weil ich etwas nur einmal brauche ist es noch kein Grund für ein singleton.</p>
<p>Vielleicht hab ich da eine etwas andere Philosophie, aber wenn ich erlaube das ein objekt kopiert wird/mehrfach erstellt wird dann will ich mir auch sicher sein dass es intuitiv und einwandfrei funktioniert. Auch wenn ich 3 Jahre später nachdem ich alles vergessen habe nochmal drüber schau. Aus demselben Grund mach ich auch operator= und copyctor private falls ich nach den aktuellen Anforderungen nicht klar entscheiden kann, was der eigentlich machen soll (und ich ihn noch eh nicht brauche).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048585</guid><dc:creator><![CDATA[kleiner Troll]]></dc:creator><pubDate>Wed, 13 Apr 2011 10:37:03 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 10:53:00 GMT]]></title><description><![CDATA[<p>kleiner Troll schrieb:</p>
<blockquote>
<p>Ein Objekt das singleton ist mehrfach zu erlauben ist erstmal ne sehr einfach aufgabe.. Konstruktor public, getInstance oder so weg, dann variable global machen (oder aber auf dependency injection umstellen wenn man will). <strong>Aufrufe noch korrigieren und fertig.</strong></p>
</blockquote>
<p>Äh.<br />
Du hast sowas noch nie in einem grösseren Projekt gemacht, oder?<br />
Die Kleinigkeit &quot;Aufrufe korrigieren&quot; kann Tage dauern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048595</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 13 Apr 2011 10:53:00 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 11:06:58 GMT]]></title><description><![CDATA[<p>volkard</p>
<blockquote>
<p>theApp ist global und nicht static in der main.cpp, theWorld lokal und nicht static in der main(), Hilfstabellen zum Speichermanager sind dort im anonymous namespace also global und static, der Systemdrucker ist ein Meyers-Singleton also lokal und static, die Winsock-DLL hat die Tendenz dazu, im anonymous namespace der Socket.cpp zu liegen also lokal und static, kann aber auch durchgereicht werden also lokal und nicht static.</p>
</blockquote>
<p>Hmm... Wieso sind manche Dinge statisch und andere nicht? Global und lokal verstehe ich, das hat einfach mit den Zugriffsrechten zu tun bzw. gibt es für Kapselung halt lokal + Zugriffsmethode.</p>
<p>Oder meinst Du ein anderes static als das mit dem <code>static</code> -Schlüsselwort? Und ich nehme an, mit global + nicht-static meinst Du nicht, dass das innerhalb der main()-Funktion deklariert ist, oder? Falls doch, inwiefern ist das denn global?</p>
<p>dot:<br />
Die Punkte sind mir schon bewusst, danke. <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/2048601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048601</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Wed, 13 Apr 2011 11:06:58 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 12:11:14 GMT]]></title><description><![CDATA[<p>Naja, was ist für dich &quot;größer&quot;?<br />
200k+ Zeilen? Nö hab ich zugegebenermaßen nicht.<br />
20k+ Zeilen? Jop.</p>
<p>Sicher ist das nicht ne Sache von 5 Minuten, zumindest je nachdem wie tief das Singleton im Programm verankert ist.. Aber da es prinzipiell eine einfache Aufgabe ist muss man sich nicht so viele Sorgen um bugs die man einführen würde während dieser arbeit machen.</p>
<p>&quot;Tage&quot; dauern würd ich für übertrieben halten,zumindest wenn man die variante mit der globalen variable nimmt.<br />
Kann man ja einfach nach namespace::GetInstance() suchen und das entsprechend ersetzen. Logisch muss man am code ja überhaupt nichts ändern.</p>
<p>Schwieriger wirds natürlich wenn man auf dependency injection umstellt. Aber auch das seh ich als machbar an - vorallem als viel weniger arbeit als ein Riesenprogramm auf spezifikationen auszulegen, dies in 80% der Fälle nie brauchen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048647</guid><dc:creator><![CDATA[kleiner Troll]]></dc:creator><pubDate>Wed, 13 Apr 2011 12:11:14 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 13:23:49 GMT]]></title><description><![CDATA[<p>kleiner Troll schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Eisflamme schrieb:</p>
<blockquote>
<p>Und was benutzt Du dann von beiden Varianten lieber?<br />
Also verbietest Du Mehrfachinstanziierung von Einmal-Objekten nicht?</p>
</blockquote>
<p>Normalerweise nicht. Im nächsten Programm will ich zwei Welten haben. Oder zwei Drucker.</p>
</blockquote>
<p>Muss sagen, das argument verstehe ich irgendwie nie so richtig. Normalerweise ist es einfacher ein Programm so zu schreiben, dass es von bestimmten Dingen nur eines gibt, weil man halt nur einen Fall prüfen muss. D.h. wenn ich mein Programm nur auf eine &quot;Welt&quot; auslege, kann ich eben nicht eine zweite einfach erstellen und das wird dann schon alles gutgehen. Entweder also programmierst du von Anfang an so das du x Welten erwartest, und machst dir falls du es nie braucht völlig unnötige Arbeit, oder aber du erlaubst es ein Objekt zu kopieren das logisch gesehen eben nicht kopiert werden darf.</p>
</blockquote>
<p>Tut mir leid, aber ich programmiere zuerst ein Game mit nur einer Welt. Und denke dabei absolut nicht, daß mehrere Welten möglich wären. Und dann wenn ich es zum Multi-Player-Game ausbauen will, wäre ich verratzt, wenn ich die Welt-Klasse (ohne Not!) zum Singleton gemacht hätte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048692</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 13 Apr 2011 13:23:49 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 13:42:40 GMT]]></title><description><![CDATA[<p>kleiner Troll schrieb:</p>
<blockquote>
<p>Ein Objekt das singleton ist mehrfach zu erlauben ist erstmal ne sehr einfach aufgabe.. Konstruktor public, getInstance oder so weg, dann variable global machen (oder aber auf dependency injection umstellen wenn man will). Aufrufe noch korrigieren und fertig.</p>
</blockquote>
<p>Falsch.<br />
Weil es ein Singleton war, haben die Armeen und Häuser, die Dialoge und Buttons NICHT gespeichert, auf welche Welt sie wirken, denn es gibt ja nur eine.<br />
Gibt es auf einmal zwei Welten, muß alles neu angefaßt werden.<br />
Das Singleton-Versprechen ist so stark, das tut man nicht ohne Not mal dahinsagen. Jedenfalls ich nicht.</p>
<p>kleiner Troll schrieb:</p>
<blockquote>
<p>Aus demselben Grund mach ich auch operator= und copyctor private falls ich nach den aktuellen Anforderungen nicht klar entscheiden kann, was der eigentlich machen soll (und ich ihn noch eh nicht brauche).</p>
</blockquote>
<p>So ich auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048696</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 13 Apr 2011 13:42:40 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 13:42:07 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Hmm... Wieso sind manche Dinge statisch und andere nicht?</p>
</blockquote>
<p>Bei den globalen: Aus Tradition, nur aus Tradition, ohne, daß das besonders sinnvoll wäre.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048707</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 13 Apr 2011 13:42:07 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 13:54:38 GMT]]></title><description><![CDATA[<blockquote>
<p>Vollkommen falsch! Falsch. Falsch. Falsch. Falsch. Falsch.</p>
</blockquote>
<p>Dazu zitiere ich mich einfach mal selbst</p>
<blockquote>
<p>Entweder also programmierst du von Anfang an so das du x Welten erwartest, und machst dir falls du es nie braucht völlig unnötige Arbeit, oder aber du erlaubst es ein Objekt zu kopieren das logisch gesehen eben nicht kopiert werden darf.</p>
</blockquote>
<p>Der Text ging eben unter der Annahme, dass das restliche Programm bereits mit mehreren instanzen umgehen kann.</p>
<p>Du bist also der Meinung du schreibst stunden um stunden code um mehrere Welten zu unterstützen die du vielleicht mal brauchen KÖNNTEST? Bitte, verbiete ich dir nicht. Ich spar mir diese Arbeit - und mach konsequenterweise dann eben die Instanz, dies nur einmal geben darf zu einem singleton. Und falls sich doch tatsächlich die Anforderung ändert, kann ich diese Änderungen nachliefern. Das es syntaktisch bis dahin ein singleton war stört mich nicht weiter, weil eben nur das umzustellen ist ein moderator wenn auch zugegebenermaßen relevanter aufwand. Der logische/Design- Aufwand ist deutlich größer - egal ob man das jetzt von Anfang an macht oder nachholt.<br />
Nur häufig baut man sich halt nunmal Flexibilität mit viel mühen die man niemals braucht. Man kann sich natürlich wunderbar streiten was mehr arbeit macht, nachrüsten oder alles &quot;richtig&quot; machen damit man, falls man später etwas tatsächlich braucht weniger arbeit hat. Ist auch eine Frage wie wahrscheinlich es ist das sich entsprechende Anforderungen ändern. Muss man abschätzen, und wenn ich der Meinung bin es ist unwahrscheinlich das ichs später brauche mach ich ein singleton draus, inklusive vereinfachter logik. Deswegen überzeugt mich dieses Gebetsmühlenartige &quot;aber man könnte es später ja mehrmals brauchen&quot; auch nicht. Diese Aussage ist zwar imho völlig korrekt, aber leider nicht das einzige, was es zu beachten gibt.</p>
<p>Und btw, auch im multiplayer gibt's nur eine Welt. Es gibt mehrere Spieler, aber (vom Modell her) immer noch eine Welt. Oder spielt dein Multiplayer in zwei verschiedenen leveln? (tatsächlich hat natürlich jeder seine eigene Kopie, und um das zu synchronisieren gibt's halt oft einen server der DIE EINE Welt hält und entscheidet was jetzt wie ist - die anderen haben eher nur ein Abbild)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048713</guid><dc:creator><![CDATA[kleiner Troll]]></dc:creator><pubDate>Wed, 13 Apr 2011 13:54:38 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 13:57:31 GMT]]></title><description><![CDATA[<p>Nur falls sich jemand wundert, Volkard hat nachdem ich zitiert habe seinen Text noch leicht geändert. (darfst gerne meinen post oben korrigieren und den hier löschen, inhaltlich ändert sich ja nichts)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048716</guid><dc:creator><![CDATA[kleiner Troll]]></dc:creator><pubDate>Wed, 13 Apr 2011 13:57:31 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 14:12:49 GMT]]></title><description><![CDATA[<p>Viele Klassen kann man doch schreiben und sie nur einmal benutzen. Oft ist es kein Problem sie mehrfach zu nutzen bzw. erfordert das nur wenige Erweiterungen. Die Klasse zum Singleton zu machen ist da sogar mehr Arbeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048729</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Wed, 13 Apr 2011 14:12:49 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 14:24:01 GMT]]></title><description><![CDATA[<p>Sowas würd ich auch nicht zum Singleton machen. Wenn mehrere Instanzen einer Klasse kein Problem sind, gibt es ja keinen Grund mehrere Instanzen einer Klasse zu verbieten. Beispiel: Eine Konsole zur Eingabe von Befehlen (z.B. zum debuggen) während dem laufenden Programm. Wenn das abfangen der Tastatureingaben entsprechend gebaut ist, gibt's da kein Problem davon 5 auf einmal zu haben - selbst wenn man nur eine auf einmal sinnvoll verwenden kann.<br />
Andersrum würde ich die Art und Weise wie ich Tastatureingaben handhabe nicht ändern, nur um 5 solche Konsolen starten zu können. Das lass ichs dann lieber als singleton.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048741</guid><dc:creator><![CDATA[kleiner Troll]]></dc:creator><pubDate>Wed, 13 Apr 2011 14:24:01 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 14:54:12 GMT]]></title><description><![CDATA[<p>Wenn Du eine Klasse bastelst, ist es aber doch immer so, dass alles darin Gebaute für Mehrfachinstanziierung klappt. Du erzeugst dort benötigte Objekte, die am Ende wieder zerstört werden, und alles Verwendete kann man über die Methoden beeinflussen und nutzen.</p>
<p>So was wird naturgemäß nicht zum Singleton gemacht. Aus deinen Aussagen ging hervor, dass Du eine Klasse, die nicht mehrere Instanzen haben würde, lieber zum Singleton machen würdest. Später schränkst Du das auf Klassen ein, bei denen eine Verwendung von mehreren Instanzen zusätzlichen Aufwand benötigen würde, sodass Du diese dann, falls es eh erstmal nur eine logische Instanz gibt, zum Singleton machst.</p>
<p>Aber was für Klassen sollen das denn sein? Die meisten sind eben schon durch den Aufbau einer Klasse mit ctor/dtor an sich so gebaut, dass man die mehrfach nutzen kann, das ist der Standard und nicht andersrum.</p>
<p>Und volkard meint nur, wenn es nicht absolut auszuschließen ist, dass man eine Klasse &quot;Universum&quot; mehrfach nutzen wird, sollte man die eben nicht zum Singleton machen, auch wenn die vorläufige Planung nur ein Objekt vorsieht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048768</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Wed, 13 Apr 2011 14:54:12 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton vs unnamed namespace on Wed, 13 Apr 2011 15:03:28 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Und volkard meint nur, wenn es nicht absolut auszuschließen ist, dass man eine Klasse &quot;Universum&quot; mehrfach nutzen wird, sollte man die eben nicht zum Singleton machen, auch wenn die vorläufige Planung nur ein Objekt vorsieht.</p>
</blockquote>
<p>Nicht ganz. Auch wenn ich absolut ausschließen kann, daß man eine Klasse &quot;Universum&quot; mehrfach nutzen werde, mache ich sie nicht einfach zum Singleton. Sondern erst, wenn ich verbieten muß, daß es sie mehrfach gibt. Zum Beispiel, weil es ich der Einfachheit halber nicht durchreichen will. Die Konsole zum Beispiel, falls es eh sowas wie Fenster gibt, Eingabedialoge, dann kann das Spiel ja schon die Tastatureingabe ans aktive Fenster/Dialog/Editbox weiterleiten. Da gibt es überhaupt keinen Grund, die Konsole zum Singleton zu machen. Allein, ich lege nur eine davon an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048776</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 13 Apr 2011 15:03:28 GMT</pubDate></item></channel></rss>