<?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[Polymorphes Singleton]]></title><description><![CDATA[<p>Abend,</p>
<p>ich habe eine Singletonklasse:</p>
<pre><code class="language-cpp">class ResourceManager {
private:
   ResourceManager();
   ResourceManager(const ResourceManager&amp; rhs);
   ~ResourceManager();
   ResourceManager&amp; operator=(const ResourceManager&amp; rhs);

public:

   static ResourceManager&amp; getInstance();

   virtual Buffer* createBuffer(Buffer::Type bufferType, IndexType::Type indexType) = 0;

};
</code></pre>
<p>Normalerweise würde ich die Zugriffsmethode so schreiben:</p>
<pre><code class="language-cpp">ResourceManager&amp; ResourceManager::getInstance() {
	static ResourceManager instance;
	return instance;
}
</code></pre>
<p>Jetzt gibt es da nur ein Problem: ResourceManager soll eine Basisklasse sein und Subklassen sollen die pure virtual methoden implementieren.</p>
<p>Im Grunde soll es also so benutzbar sein:</p>
<pre><code class="language-cpp">class FooResourceManager : public ResourceManager { ... };
class BarResourceManager : public ResourceManager { ... };

// Hier zur Laufzeit festlegen, dass der FooResourceManager benutzt werden soll
Buffer* b = ResourceManager::getInstance().createBuffer(...); // Soll jetzt FooResourceManager::createBuffer() aufrufen
</code></pre>
<p>Wie könnte man das in C++ implementieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/289969/polymorphes-singleton</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 19:44:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289969.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 16 Jul 2011 15:19:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Polymorphes Singleton on Sat, 16 Jul 2011 15:19:53 GMT]]></title><description><![CDATA[<p>Abend,</p>
<p>ich habe eine Singletonklasse:</p>
<pre><code class="language-cpp">class ResourceManager {
private:
   ResourceManager();
   ResourceManager(const ResourceManager&amp; rhs);
   ~ResourceManager();
   ResourceManager&amp; operator=(const ResourceManager&amp; rhs);

public:

   static ResourceManager&amp; getInstance();

   virtual Buffer* createBuffer(Buffer::Type bufferType, IndexType::Type indexType) = 0;

};
</code></pre>
<p>Normalerweise würde ich die Zugriffsmethode so schreiben:</p>
<pre><code class="language-cpp">ResourceManager&amp; ResourceManager::getInstance() {
	static ResourceManager instance;
	return instance;
}
</code></pre>
<p>Jetzt gibt es da nur ein Problem: ResourceManager soll eine Basisklasse sein und Subklassen sollen die pure virtual methoden implementieren.</p>
<p>Im Grunde soll es also so benutzbar sein:</p>
<pre><code class="language-cpp">class FooResourceManager : public ResourceManager { ... };
class BarResourceManager : public ResourceManager { ... };

// Hier zur Laufzeit festlegen, dass der FooResourceManager benutzt werden soll
Buffer* b = ResourceManager::getInstance().createBuffer(...); // Soll jetzt FooResourceManager::createBuffer() aufrufen
</code></pre>
<p>Wie könnte man das in C++ implementieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2093637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2093637</guid><dc:creator><![CDATA[KarlDS]]></dc:creator><pubDate>Sat, 16 Jul 2011 15:19:53 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphes Singleton on Sat, 16 Jul 2011 15:30:35 GMT]]></title><description><![CDATA[<p>Ach, schon wieder ein ResourceManager.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2093641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2093641</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 16 Jul 2011 15:30:35 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphes Singleton on Sat, 16 Jul 2011 15:35:56 GMT]]></title><description><![CDATA[<p>Moment, das macht für mich keinen Sinn. Gibt es beide Ressourcenmanager parallel oder möchtest Du, dass der jeweilige erzeugt wird, sobald er verwendet wird? Bist Du sicher, dass Du hier überhaupt ein Singleton benötigst? Wenn es schon zwei Typen von Ressourcenmanagern geben soll, dann nicht vielleicht auch mehrere Ressourcenmanager an sich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2093643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2093643</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 16 Jul 2011 15:35:56 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphes Singleton on Sat, 16 Jul 2011 15:42:08 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Moment, das macht für mich keinen Sinn. Gibt es beide Ressourcenmanager parallel oder möchtest Du, dass der jeweilige erzeugt wird, sobald er verwendet wird? Bist Du sicher, dass Du hier überhaupt ein Singleton benötigst? Wenn es schon zwei Typen von Ressourcenmanagern geben soll, dann nicht vielleicht auch mehrere Ressourcenmanager an sich?</p>
</blockquote>
<p>Es gibt zur Laufzeit genau einen. Also entweder wird der FooResourceManager benutzt, oder BarResourceManager etc.</p>
<p>Ich brauche einfach nur an vielen Stellen Zugriff auf den ResourceManager.<br />
Ich will schreiben können:</p>
<pre><code class="language-cpp">Bla* b = ResourceManager.getInstance().createXY();
</code></pre>
<p>und es is mir an dieser Stelle egal, welcher ResourceManager das createXY() übernimmt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2093645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2093645</guid><dc:creator><![CDATA[KarlDS]]></dc:creator><pubDate>Sat, 16 Jul 2011 15:42:08 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphes Singleton on Sat, 16 Jul 2011 16:11:08 GMT]]></title><description><![CDATA[<p>Wenn du es zur Compilezeit entscheidest, dann</p>
<pre><code class="language-cpp">ResourceManager&amp; ResourceManager::getInstance() {
    static ResourceManager* instance = new FooResourceManager();
//oder 
    static ResourceManager* instance = new BarResourceManager();
    ...
}
</code></pre>
<p>Oder ein initResourceManager( ResourceManager* ), wenns zur Leufzeit sein soll</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2093651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2093651</guid><dc:creator><![CDATA[technik]]></dc:creator><pubDate>Sat, 16 Jul 2011 16:11:08 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphes Singleton on Sat, 16 Jul 2011 18:01:08 GMT]]></title><description><![CDATA[<p>Die Benutzung von Singletons ist doch ein Anti-Pattern. Warum willst du dir sowas antun?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2093683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2093683</guid><dc:creator><![CDATA[klausi]]></dc:creator><pubDate>Sat, 16 Jul 2011 18:01:08 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphes Singleton on Sun, 17 Jul 2011 07:32:02 GMT]]></title><description><![CDATA[<p>Verwende DI - da hast Du das Problem nicht.</p>
<p><strong>Edit:</strong><br />
<a href="http://www.youtube.com/watch?v=-FRm3VPhseI" rel="nofollow">http://www.youtube.com/watch?v=-FRm3VPhseI</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2093782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2093782</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sun, 17 Jul 2011 07:32:02 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphes Singleton on Sun, 17 Jul 2011 07:59:15 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Verwende DI - da hast Du das Problem nicht.</p>
</blockquote>
<p>Welches Problem?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2093784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2093784</guid><dc:creator><![CDATA[1234567890ß]]></dc:creator><pubDate>Sun, 17 Jul 2011 07:59:15 GMT</pubDate></item><item><title><![CDATA[Reply to Polymorphes Singleton on Sun, 17 Jul 2011 09:47:14 GMT]]></title><description><![CDATA[<blockquote>
<p>Es gibt zur Laufzeit genau einen. Also entweder wird der FooResourceManager benutzt, oder BarResourceManager etc.</p>
</blockquote>
<p>Das bedeutet, Du willst fixieren, welchen man benutzt. Dann geht techniks Ansatz.</p>
<p>Aber</p>
<blockquote>
<p>Ich brauche einfach nur an vielen Stellen Zugriff auf den ResourceManager</p>
</blockquote>
<p>das habe ich befürchtet. Singletons nutzt man nicht, um an vielen Stellen Zugriff zu erreichen, sondern wenn man unbedingt will, dass es nur eine Instanz von dem Objekt geben darf. Diese Einschränkung ist hier aber vermutlich gar nicht notwendig.</p>
<p>Insofern solltest Du das Singleton weglassen und die Instanz immer dem Objekt geben, das es benötigt. Dann sieht man die Abhängigkeiten auch beim Initialisieren und Du kannst es auch besser mit Unit-Tests testen etc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2093803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2093803</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sun, 17 Jul 2011 09:47:14 GMT</pubDate></item></channel></rss>