<?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[Objekte nur einmal erzeugen]]></title><description><![CDATA[<p>Mahlzeit!</p>
<p>ich habe ein bißchen blödes Problem. Also ich habe eine Klasse, die verschiedene Sachen von der Festplatte lädt (z.B. Texturen).<br />
Nur will ich die Textur nur genau einmal laden, danach nur noch die bereits geladene Textur liefern. Im Moment sieht es in etwa so aus:</p>
<pre><code class="language-cpp">class Loader {
   map&lt;string, weak_ptr&lt;Texture&gt; m_textures;

   shared_ptr&lt;Texture&gt; loadTexture(const std::string&amp; name);
};

// Benutzung:
shared_ptr&lt;Texture&gt; myTex = loader-&gt;loadTexture(&quot;test.png&quot;); // Erstes Mal, dass &quot;test.png&quot; angefordert wird =&gt; von Platte laden. 
// Nach dem Aufruf ist ein weak_ptr auf die Texture in Loader::m_textures gespeichert

shared_ptr&lt;Texture&gt; myTex2 = loader-&gt;loadTexture(&quot;test.png&quot;); // Lädt nichts von der Platte. Liefert nur shared_ptr auf die bereits geladene Textur
</code></pre>
<p>Sollte klar sein. Es gibt nur ein Problem: Manchmal will man feinere Kontrolle über das initiale Laden. Beim 1. Laden will man z.B. gerne angeben ob MipMaps erstellt werden oder auf welche Größe die Textur skaliert werden soll, also z.B sowas:</p>
<pre><code class="language-cpp">shared_ptr&lt;Texture&gt; myTex = loader-&gt;loadTexture(&quot;test.png&quot;, 640, 480, 3);
</code></pre>
<p>Das Problem ist nur, dass die zusätzlichen Parameter (640, 480, etc) bei allen weiteren load Aufrufen nicht mehr wichtig sind, ich sie aber doch immer angeben muss.</p>
<p>Hat irgendwer eine Idee, wie man das etwas besser machen könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/290941/objekte-nur-einmal-erzeugen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 01:31:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/290941.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 07 Aug 2011 13:03:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekte nur einmal erzeugen on Sun, 07 Aug 2011 13:03:59 GMT]]></title><description><![CDATA[<p>Mahlzeit!</p>
<p>ich habe ein bißchen blödes Problem. Also ich habe eine Klasse, die verschiedene Sachen von der Festplatte lädt (z.B. Texturen).<br />
Nur will ich die Textur nur genau einmal laden, danach nur noch die bereits geladene Textur liefern. Im Moment sieht es in etwa so aus:</p>
<pre><code class="language-cpp">class Loader {
   map&lt;string, weak_ptr&lt;Texture&gt; m_textures;

   shared_ptr&lt;Texture&gt; loadTexture(const std::string&amp; name);
};

// Benutzung:
shared_ptr&lt;Texture&gt; myTex = loader-&gt;loadTexture(&quot;test.png&quot;); // Erstes Mal, dass &quot;test.png&quot; angefordert wird =&gt; von Platte laden. 
// Nach dem Aufruf ist ein weak_ptr auf die Texture in Loader::m_textures gespeichert

shared_ptr&lt;Texture&gt; myTex2 = loader-&gt;loadTexture(&quot;test.png&quot;); // Lädt nichts von der Platte. Liefert nur shared_ptr auf die bereits geladene Textur
</code></pre>
<p>Sollte klar sein. Es gibt nur ein Problem: Manchmal will man feinere Kontrolle über das initiale Laden. Beim 1. Laden will man z.B. gerne angeben ob MipMaps erstellt werden oder auf welche Größe die Textur skaliert werden soll, also z.B sowas:</p>
<pre><code class="language-cpp">shared_ptr&lt;Texture&gt; myTex = loader-&gt;loadTexture(&quot;test.png&quot;, 640, 480, 3);
</code></pre>
<p>Das Problem ist nur, dass die zusätzlichen Parameter (640, 480, etc) bei allen weiteren load Aufrufen nicht mehr wichtig sind, ich sie aber doch immer angeben muss.</p>
<p>Hat irgendwer eine Idee, wie man das etwas besser machen könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102958</guid><dc:creator><![CDATA[Sushi2]]></dc:creator><pubDate>Sun, 07 Aug 2011 13:03:59 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte nur einmal erzeugen on Sun, 07 Aug 2011 13:22:55 GMT]]></title><description><![CDATA[<p>Du kannst doch einfach eine <code>loadTexture()</code> -Überladung ohne Zusatzparameter anbieten, oder? Du musst dann sinnvolle Defaultwerte festlegen. Alternativ schreibst du dir eine Methode <code>shared_ptr&lt;Texture&gt; getTexture(const std::string&amp; name)</code> , die nie neu lädt, d.h. bei Nicht-Vorhandensein einen Nullzeiger zurückgibt oder eine Exception wirft.</p>
<p>Bei meinem (generischen) Ressourcen-System verwende ich Klassen, die angeben, wie ein Objekt geladen wird. Ich nenne sie &quot;Keys&quot;, da sie gleichzeitig die Schlüssel in der Map sind. Sie bieten einen <code>operator&lt;</code> für Strict Weak Ordering an. Zum Beispiel könntest du bei dir im <code>operator&lt;</code> nur die Strings vergleichen (da es sich ja um die gleiche Textur handelt, falls der String gleich ist). Damit kannst du Keys auf verschiedene Weise erstellen, und je nachdem sind sie dann äquivalent im Bezug auf das Sortierkriterium.</p>
<p>Angewandt sähe das so aus:</p>
<pre><code class="language-cpp">TextureKey key(&quot;test.png&quot;, 640, 480, 3);
shared_ptr&lt;Texture&gt; myTex = loader-&gt;loadTexture(key);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2102960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102960</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 07 Aug 2011 13:22:55 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte nur einmal erzeugen on Sun, 07 Aug 2011 13:46:35 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Du kannst doch einfach eine <code>loadTexture()</code> -Überladung ohne Zusatzparameter anbieten, oder? Du musst dann sinnvolle Defaultwerte festlegen.</p>
</blockquote>
<p>Klar. Aber das ergibt nicht viel Sinn. Ich kann ja an hunderten Stellen loadTexture() aufrufen und alle sind gleichwertig. Dh. bei keinem Auruf weiß ich, ob die Textur nun wirklich geladen wird.<br />
Wenn ich aber nun einmal loadTexture() mit Parametern aufruf und alle weiteren Male ohne Parameter, dann erfordert das ja Wissen, ob sie geladen ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102971</guid><dc:creator><![CDATA[Sushi2]]></dc:creator><pubDate>Sun, 07 Aug 2011 13:46:35 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte nur einmal erzeugen on Sun, 07 Aug 2011 14:02:45 GMT]]></title><description><![CDATA[<p>Ja klar. Aber bei jedem Mal, wo du die Zusatzparameter nicht angibst, gehst du eigentlich davon aus, dass sie schon mal angegeben wurden. Daher musst du sie streng genommen immer angeben, um ganz sicher zu sein.</p>
<p>Oder du speicherst anfänglich eine Zuordnung von <code>std::string</code> zu diesen Parametern irgendwo ab. Oder schiebst Keys umher. Oder...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2102978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2102978</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 07 Aug 2011 14:02:45 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte nur einmal erzeugen on Sun, 07 Aug 2011 15:22:50 GMT]]></title><description><![CDATA[<p>Dir ist aber schon klar, dass bei so einem Aufruf</p>
<pre><code class="language-cpp">{
  shared_ptr&lt;Texture&gt; myTex = loader-&gt;loadTexture(&quot;test.png&quot;); // Erstes Mal, dass &quot;test.png&quot; angefordert wird =&gt; von Platte laden.
}
// hier ist das Bild wieder weg!
</code></pre>
<p>der Speicher nach der &quot;}&quot;-Klammer wieder freigegeben wird (der weak_ptr also ungültig ist), und du das Bild erneut laden musst? Dann müssten natürlich auch bei jedem Aufruf alle benötigten Parameter mitgegeben werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2103012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2103012</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sun, 07 Aug 2011 15:22:50 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte nur einmal erzeugen on Sun, 07 Aug 2011 15:33:50 GMT]]></title><description><![CDATA[<p>Ohne den Thread ganz gelesen zu haben, klingt das nach einem Singleton-Muster, das helfen könnte.<br />
<a href="http://de.wikipedia.org/wiki/Singleton_%28Entwurfsmuster%29#Implementierung_in_C.2B.2B" rel="nofollow">http://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)#Implementierung_in_C.2B.2B</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2103018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2103018</guid><dc:creator><![CDATA[Jay1980]]></dc:creator><pubDate>Sun, 07 Aug 2011 15:33:50 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte nur einmal erzeugen on Sun, 07 Aug 2011 15:37:09 GMT]]></title><description><![CDATA[<p>Jay1980 schrieb:</p>
<blockquote>
<p>Ohne den Thread ganz gelesen zu haben, klingt das nach einem Singleton-Muster, das helfen könnte.<br />
<a href="http://de.wikipedia.org/wiki/Singleton_%28Entwurfsmuster%29#Implementierung_in_C.2B.2B" rel="nofollow">http://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)#Implementierung_in_C.2B.2B</a></p>
</blockquote>
<p>Der Beitrag ist auf so vielen Ebenen fail...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2103021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2103021</guid><dc:creator><![CDATA[Rolleis]]></dc:creator><pubDate>Sun, 07 Aug 2011 15:37:09 GMT</pubDate></item></channel></rss>