<?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[Design - STL Container - Zeiger oder StackObjekte ?]]></title><description><![CDATA[<p>Hallo mal wieder,</p>
<p>da mir hier im Forum schon viel und kompetent geholfen wurde, ich aber immer noch blutiger C++ Anfänger bin habe ich zu diesem Thema noch eine Frage.</p>
<p>Ich habe mir meine bisherigen Threads dazu schon durchgelesen, sowie auch einige andere Threads.</p>
<p>Allerdings werde ich dadurch nur immer verwirrter anstatt Klarheit zu bekommen!</p>
<p>Es wurde z.B. von versch. Postern gesagt, dass sie in C++ (fast) ganz ohne Zeiger auskommen!</p>
<p>Nun habe ich aber ein paar Klassen, die quasi als Factories agieren, in denen also Objekte eines bestimmten Typs (pro Klasse ein Typ, oder wäre hier ein Template-Ansatz besser?) erzeugt und verwaltet werden.<br />
Diese Klassen sorgen für das Anlegen und Löschen der Objekte im Speicher und verwalten die Objekte je nachdem, wie sie wieder aufgefunden werden müssen mit (unterschiedlichen) STL-Containern.</p>
<p>Da die Objekte von anderen Klassen zur Laufzeit verwendet und dementsprechend in der Factory-Klasse wiedergefunden werden müssen, müssen die Objekte also den Aufruf der create-Methode überstehen, in der sie erzeugt und in den entsprechenden STL-Container abgelegt werden.</p>
<p>Als Bsp.: In meiner &quot;Factory&quot; sollen grafische Objekte erzeugt und verwaltet werden, jedes nur einmal, ich muss aber jedes über eine Methode wiederfinden und nen Zeiger bzw. Referenz darauf bekommen können, da ich sie an unterschiedlichen Stellen im Programm einsetzen will.</p>
<p>Das geht doch nur und ausschließlich mit Zeigern und der Anlage der Objekte mittels new!? Oder nicht?</p>
<p>Falls noch Code benötigt wird, kann ich diesen gern nachreichen (steht z.T. schon in nem anderen Thread)!</p>
<p>Vielen Dank schon einmal!<br />
Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/184094/design-stl-container-zeiger-oder-stackobjekte</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 14:41:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/184094.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 12 Jun 2007 11:17:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Design - STL Container - Zeiger oder StackObjekte ? on Tue, 12 Jun 2007 11:17:53 GMT]]></title><description><![CDATA[<p>Hallo mal wieder,</p>
<p>da mir hier im Forum schon viel und kompetent geholfen wurde, ich aber immer noch blutiger C++ Anfänger bin habe ich zu diesem Thema noch eine Frage.</p>
<p>Ich habe mir meine bisherigen Threads dazu schon durchgelesen, sowie auch einige andere Threads.</p>
<p>Allerdings werde ich dadurch nur immer verwirrter anstatt Klarheit zu bekommen!</p>
<p>Es wurde z.B. von versch. Postern gesagt, dass sie in C++ (fast) ganz ohne Zeiger auskommen!</p>
<p>Nun habe ich aber ein paar Klassen, die quasi als Factories agieren, in denen also Objekte eines bestimmten Typs (pro Klasse ein Typ, oder wäre hier ein Template-Ansatz besser?) erzeugt und verwaltet werden.<br />
Diese Klassen sorgen für das Anlegen und Löschen der Objekte im Speicher und verwalten die Objekte je nachdem, wie sie wieder aufgefunden werden müssen mit (unterschiedlichen) STL-Containern.</p>
<p>Da die Objekte von anderen Klassen zur Laufzeit verwendet und dementsprechend in der Factory-Klasse wiedergefunden werden müssen, müssen die Objekte also den Aufruf der create-Methode überstehen, in der sie erzeugt und in den entsprechenden STL-Container abgelegt werden.</p>
<p>Als Bsp.: In meiner &quot;Factory&quot; sollen grafische Objekte erzeugt und verwaltet werden, jedes nur einmal, ich muss aber jedes über eine Methode wiederfinden und nen Zeiger bzw. Referenz darauf bekommen können, da ich sie an unterschiedlichen Stellen im Programm einsetzen will.</p>
<p>Das geht doch nur und ausschließlich mit Zeigern und der Anlage der Objekte mittels new!? Oder nicht?</p>
<p>Falls noch Code benötigt wird, kann ich diesen gern nachreichen (steht z.T. schon in nem anderen Thread)!</p>
<p>Vielen Dank schon einmal!<br />
Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303867</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Tue, 12 Jun 2007 11:17:53 GMT</pubDate></item><item><title><![CDATA[Reply to Design - STL Container - Zeiger oder StackObjekte ? on Tue, 12 Jun 2007 11:31:27 GMT]]></title><description><![CDATA[<p>Ja, es gibt das eine Extrem und das andere Extrem. Und du bist jetzt in der anderen gelandet. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Wie du aber selber schon richtig geschrieben hast, kommt man <em>&quot;(fast) ganz ohne Zeiger&quot;</em> aus. Wenn hier dieser &quot;Spruch&quot; gezogen wird, soll eigentlich nur das eine Extrem deutlich gemacht werden.</p>
<p>new benutzt man dann, wenn man dynamisch(e) Objekte anlegen will. Dazu zählt, wenn man zur Laufzeit nicht weiß, welcher genaue Typ erzeugt werden soll.</p>
<p>Ein Container vector&lt;A&gt; kann ausschliesslich A-Objekte aufnehmen. Will ich A-Objekte und davon abgeleitete aufnehmen, geht das nicht und ich muß einen vector&lt;A*&gt; Container definieren. Oder ich baue mir einen Handler, in dem A-Objekte drin liegen:</p>
<pre><code class="language-cpp">// Ganz spartanisch (Pseudocode):
struct A_Handler
{
    A* a_ptr;
};
vector&lt;A_Handler&gt; a;
</code></pre>
<p>Aber dann kann man auch gleich SmartPointer benutzen. <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>
<p>Du willst also deine Factory-Objekte in einem Container zwischenlagern? Ist das jetzt wegen der &quot;new&quot;-Thematik oder ist das dein erdachtes Design? Wenn es nur um die Vermeidung des new geht, solltest du über Smart-Pointer nachdenken. Gib einfach ein mit new erzeugtes Objekt in einem Smart-Pointer raus.</p>
<p>In einer Factory werden aber für gewöhnlich Objekte mit new erzeugt. Man könnte sie auch ohne new erzeugen, in einem Container speichern und dann eine Referenz raus geben. Aber dann kannst du eigentlich nur immer einen Objekt-Typ erzeugen. Nicht so der Sinn einer Factory. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303876</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Tue, 12 Jun 2007 11:31:27 GMT</pubDate></item><item><title><![CDATA[Reply to Design - STL Container - Zeiger oder StackObjekte ? on Tue, 12 Jun 2007 11:36:26 GMT]]></title><description><![CDATA[<p>Ist ein selbst erdachtes Design mit Anlehnung an ein, zwei Pattern.<br />
Da ich ja wie gesagt Neuling bin, hab ich mehrere Factoryklassen gemacht (s.o.), für jeden Typ eine eigene (das könnte man evtl. auch über ein Template lösen).</p>
<p>Die Verwaltung der Objekte zur Laufzeit in Container brauche ich aus folgenden Gründen:</p>
<p>1. Es steht vor der Laufzeit nicht unbedingt fest, wie viele solcher Objekte benötigt werden (müssen also dynamisch erzeugt werden).<br />
2. Die jeweiligen Objekte sollen selbst nur einmal vorkommen, aber an unterschiedlichen Stellen im Programm und zu unterschiedlichen Programmzeitpunkten verwendet werden können (sie müssen also wieder auffindbar sein).</p>
<p>Dazu hab ich mir dann die &quot;Factoryklassen&quot; überlegt, die eigentlich mehr Verwalter sind. Sie erzeugen die Objekte bei Bedarf, legen sie (z.B. zu einem Schlüssel) in einen Container und wenn eines benötigt wird, wird es anhand des übergebenen Schlüssels im Container gefunden und ein Zeiger/eine Referenz darauf zurückgegeben.</p>
<p>So die Idee!</p>
<p>Oder macht man sowas ganz ganz anders?</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303885</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Tue, 12 Jun 2007 11:36:26 GMT</pubDate></item><item><title><![CDATA[Reply to Design - STL Container - Zeiger oder StackObjekte ? on Tue, 12 Jun 2007 12:01:05 GMT]]></title><description><![CDATA[<p>Aha, also sind die Container gewollt und sind nicht aus der &quot;nicht-new-benutzen&quot;-Not heraus? Weil so hatte ich es erst verstanden.</p>
<blockquote>
<p>1. Es steht vor der Laufzeit nicht unbedingt fest, wie viele solcher Objekte benötigt werden (müssen also dynamisch erzeugt werden).</p>
</blockquote>
<p>OK, ob hier Container deshalb unabdingbar sind, sei dahin gestellt...</p>
<blockquote>
<p>2. Die jeweiligen Objekte sollen selbst nur einmal vorkommen, aber an unterschiedlichen Stellen im Programm und zu unterschiedlichen Programmzeitpunkten verwendet werden können (sie müssen also wieder auffindbar sein).</p>
</blockquote>
<p>Hem, verstehe ich nicht wirklich, was du damit sagen willst. Ein Objekt kann nur immer einmalig vorkommen.<br />
Das sie wieder auffindbar sein müssen, z.B. über einen Schlüssel oder ID, macht dann tatsächlich Sinn, sie in einen Container zu legen. Wobei Pointer bzw. die Adresse auf die er zeigt, auch ein Schlüssel oder ID ist. Ist alles eine Auslegungssache des Designers (also in dem Fall du selbst).</p>
<blockquote>
<p>Dazu hab ich mir dann die &quot;Factoryklassen&quot; überlegt, die eigentlich mehr Verwalter sind. Sie erzeugen die Objekte bei Bedarf, legen sie (z.B. zu einem Schlüssel) in einen Container und wenn eines benötigt wird, wird es anhand des übergebenen Schlüssels im Container gefunden und ein Zeiger/eine Referenz darauf zurückgegeben.</p>
</blockquote>
<p>Also ist es mehr eine Managerklasse. Die Objekterzeugung ist eher eine Nebensache. Gut, und wenn die Objekte z.B. über einen String oder eine laufende ID wiedergefunden werden sollen, macht natürlich ein Container (z.B. eine std::map) Sinn. Wenn es sich dabei immer um den gleichen Objekttyp handelt, komme ich zu dem Fazit, das du dann kein new benötigst (zumindest in erster Instanz nicht).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303902</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Tue, 12 Jun 2007 12:01:05 GMT</pubDate></item><item><title><![CDATA[Reply to Design - STL Container - Zeiger oder StackObjekte ? on Tue, 12 Jun 2007 12:14:26 GMT]]></title><description><![CDATA[<p>Vielen Dank für Deine Antworten!</p>
<p>Artchi schrieb:</p>
<blockquote>
<blockquote>
<p>1. Es steht vor der Laufzeit nicht unbedingt fest, wie viele solcher Objekte benötigt werden (müssen also dynamisch erzeugt werden).</p>
</blockquote>
<p>OK, ob hier Container deshalb unabdingbar sind, sei dahin gestellt...</p>
</blockquote>
<p>Was wären denn Alternativen?</p>
<p>Artchi schrieb:</p>
<blockquote>
<blockquote>
<p>2. Die jeweiligen Objekte sollen selbst nur einmal vorkommen, aber an unterschiedlichen Stellen im Programm und zu unterschiedlichen Programmzeitpunkten verwendet werden können (sie müssen also wieder auffindbar sein).</p>
</blockquote>
<p>Hem, verstehe ich nicht wirklich, was du damit sagen willst. Ein Objekt kann nur immer einmalig vorkommen.<br />
Das sie wieder auffindbar sein müssen, z.B. über einen Schlüssel oder ID, macht dann tatsächlich Sinn, sie in einen Container zu legen. Wobei Pointer bzw. die Adresse auf die er zeigt, auch ein Schlüssel oder ID ist. Ist alles eine Auslegungssache des Designers (also in dem Fall du selbst).</p>
</blockquote>
<p>Ok, hier hab ich wohl zuviel weggelassen!<br />
Einige der Objekte kapseln z.B. Grafikdaten und für jede Grafik soll nur ein solches Objekt angelegt und dieses überall wo nötig verwendet werden. Theoretisch könnte ich mir ja zu jeder Verwendungsmöglichkeit einer solchen Grafik schnell so ein Objekt anlegen. Dann hätte ich die Grafik mehrfach im Speicher. Das will ich vermeiden. Ähnliches gilt für die anderen Objekttypen.</p>
<p>Artchi schrieb:</p>
<blockquote>
<blockquote>
<p>Dazu hab ich mir dann die &quot;Factoryklassen&quot; überlegt, die eigentlich mehr Verwalter sind. Sie erzeugen die Objekte bei Bedarf, legen sie (z.B. zu einem Schlüssel) in einen Container und wenn eines benötigt wird, wird es anhand des übergebenen Schlüssels im Container gefunden und ein Zeiger/eine Referenz darauf zurückgegeben.</p>
</blockquote>
<p>Also ist es mehr eine Managerklasse. Die Objekterzeugung ist eher eine Nebensache. Gut, und wenn die Objekte z.B. über einen String oder eine laufende ID wiedergefunden werden sollen, macht natürlich ein Container (z.B. eine std::map) Sinn. Wenn es sich dabei immer um den gleichen Objekttyp handelt, komme ich zu dem Fazit, das du dann kein new benötigst (zumindest in erster Instanz nicht).</p>
</blockquote>
<p>Wie würde es denn dann funktionieren, wenn ich die Objekte zur Laufzeit erzeugen und erst beim Beenden des Programmes freigeben will?</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303917</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Tue, 12 Jun 2007 12:14:26 GMT</pubDate></item><item><title><![CDATA[Reply to Design - STL Container - Zeiger oder StackObjekte ? on Tue, 12 Jun 2007 12:44:42 GMT]]></title><description><![CDATA[<blockquote>
<p>Was wären denn Alternativen?</p>
</blockquote>
<p>Gar keine Container, einfach erzeugen und fertig.</p>
<blockquote>
<p>Ok, hier hab ich wohl zuviel weggelassen!<br />
Einige der Objekte kapseln z.B. Grafikdaten und für jede Grafik soll nur ein solches Objekt angelegt und dieses überall wo nötig verwendet werden. Theoretisch könnte ich mir ja zu jeder Verwendungsmöglichkeit einer solchen Grafik schnell so ein Objekt anlegen. Dann hätte ich die Grafik mehrfach im Speicher. Das will ich vermeiden. Ähnliches gilt für die anderen Objekttypen.</p>
</blockquote>
<p>OK, ist mehr als logisch. Also tatsächlich eine Managerklasse. Oder auch GrafikCache-Klasse. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Na, da weiß ich aber nicht wo wirklich das Problem ist? Sagen wir mal, du hast eine Grafik-Klasse, und jede Grafik liegt als Datei vor. Dann würde sowas Sinn machen:</p>
<pre><code class="language-cpp">class Grafik;

class GrafikManager // oder auch GrafikFaktory....
{
    std::map&lt;std::string, Grafik&gt; grafiken;

public:
    Grafik&amp; getGrafik(const std::string &amp;filename)
    {
           std::map&lt;std::string, Grafik&gt;::iterator iter = grafiken.find(filename);

           if(iter == grafiken.end() )
           {
                  Grafik gfx(filename);
                  return (grafiken[filename] = gfx);
           }
           else
              return iter-&gt;second;
    }
};
</code></pre>
<p>Eigentlich ganz easy... mußt nur bedenken, dass das Grafik-Objekt beim einfügen in den Container kopiert wird. Aber da du sicherlich die Bitmaps in einem Pointer drin hast, ist das nicht schlimm, da nur der Pointer kopiert wird und nicht die ganze Bitmap. Also, innerhalb der Factory-Klasse braucht man weiterhin kein new. Kann sein das du irgendwann vielleicht doch auf new umsteigen mußt, aber das würde ich nur machen, wenn es nötig wird.</p>
<blockquote>
<p>Wie würde es denn dann funktionieren, wenn ich die Objekte zur Laufzeit erzeugen und erst beim Beenden des Programmes freigeben will?</p>
</blockquote>
<p>Wenn Du kein new benutzt, brauchst du dich ja nicht drum kümmern. Wenn du doch new benutzt, dann bau in deiner Factory in den Destruktor etwas ein, was den Inhalt des Containers durchläuft und die Objekte löscht. Fertig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303953</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Tue, 12 Jun 2007 12:44:42 GMT</pubDate></item><item><title><![CDATA[Reply to Design - STL Container - Zeiger oder StackObjekte ? on Tue, 12 Jun 2007 12:54:53 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<pre><code class="language-cpp">...
return (grafiken[filename] = gfx);
...
};
</code></pre>
</blockquote>
<p>Das macht eine Zuweisung und gibt die Referenz auf das eingefügte Grafikobjekt zurück?</p>
<p>Artchi schrieb:</p>
<blockquote>
<p>Eigentlich ganz easy... mußt nur bedenken, dass das Grafik-Objekt beim einfügen in den Container kopiert wird. Aber da du sicherlich die Bitmaps in einem Pointer drin hast, ist das nicht schlimm, da nur der Pointer kopiert wird und nicht die ganze Bitmap. Also, innerhalb der Factory-Klasse braucht man weiterhin kein new. Kann sein das du irgendwann vielleicht doch auf new umsteigen mußt, aber das würde ich nur machen, wenn es nötig wird.</p>
</blockquote>
<p>Und die Kopie lebt so lange wie die map?</p>
<p>Artchi schrieb:</p>
<blockquote>
<blockquote>
<p>Wie würde es denn dann funktionieren, wenn ich die Objekte zur Laufzeit erzeugen und erst beim Beenden des Programmes freigeben will?</p>
</blockquote>
<p>Wenn Du kein new benutzt, brauchst du dich ja nicht drum kümmern. Wenn du doch new benutzt, dann bau in deiner Factory in den Destruktor etwas ein, was den Inhalt des Containers durchläuft und die Objekte löscht. Fertig.</p>
</blockquote>
<p>So ist es bisher: Im Destruktor wird der STL-Container durchlaufen und alle enthaltenen Objekte werden mit einem delete bedacht.</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303976</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Tue, 12 Jun 2007 12:54:53 GMT</pubDate></item><item><title><![CDATA[Reply to Design - STL Container - Zeiger oder StackObjekte ? on Tue, 12 Jun 2007 13:27:38 GMT]]></title><description><![CDATA[<blockquote>
<p>Das macht eine Zuweisung und gibt die Referenz auf das eingefügte Grafikobjekt zurück?</p>
</blockquote>
<p>Korrekt. Da es ja kopiert wird, wäre es fatal das erste gfx zu returnen. Ganz davon abgesehen, das gfx eh nur temporär ist, und temporäre Objekte als Ref returnen ist schlecht, weil es in der Zwischenzeit wieder gestorben ist. Also das returnen, was in der Map tatsächlich eingefügt wurde.</p>
<blockquote>
<p>Und die Kopie lebt so lange wie die map?</p>
</blockquote>
<p>Korrekt!</p>
<blockquote>
<p>So ist es bisher: Im Destruktor wird der STL-Container durchlaufen und alle enthaltenen Objekte werden mit einem delete bedacht.</p>
</blockquote>
<p>Ist ja auch nicht falsch. Je nach Anforderung, die du gerade hast. Das Kopieren entfällt hier natürlich. Kann je nach Objektgröße schneller sein.</p>
<p>Ab C++2009 wird sich das wohl ändern, da werden die Objekte beim Einfügen in die Container wohl nicht mehr kopiert, sondern verschoben. Dann gehts auch schnell ohne Pointer.</p>
<p>Mache es so, wie es für deine Anforderungen am besten ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1304026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1304026</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Tue, 12 Jun 2007 13:27:38 GMT</pubDate></item><item><title><![CDATA[Reply to Design - STL Container - Zeiger oder StackObjekte ? on Tue, 12 Jun 2007 14:19:03 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<blockquote>
<p>So ist es bisher: Im Destruktor wird der STL-Container durchlaufen und alle enthaltenen Objekte werden mit einem delete bedacht.</p>
</blockquote>
<p>Ist ja auch nicht falsch. Je nach Anforderung, die du gerade hast. Das Kopieren entfällt hier natürlich. Kann je nach Objektgröße schneller sein.</p>
<p>Ab C++2009 wird sich das wohl ändern, da werden die Objekte beim Einfügen in die Container wohl nicht mehr kopiert, sondern verschoben. Dann gehts auch schnell ohne Pointer.</p>
<p>Mache es so, wie es für deine Anforderungen am besten ist.</p>
</blockquote>
<p>Tja, und woher weiss ich was besser meinen Anforderungen entspricht (so als Noob meine ich)? Gibts da Kriterien, anhand derer ich das Abwägen/Entscheiden kann?</p>
<p>Der einzige Unterschied ist doch, dass ich in der Map einmal nur Zeiger drin habe, beim anderen Ansatz aber ganze Objekte (oder nur Referenzen darauf), oder?<br />
Da ist in meinen Augen eine Map mit Zeigern doch performanter als eine mit ganzen Objekten, oder?</p>
<p>Was ich dann zurückgebe, ob eine Referenz auf ein enthaltenes Objekt, oder einen Zeiger darauf ist ja in beiden Fällen unerheblich!</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1304106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1304106</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Tue, 12 Jun 2007 14:19:03 GMT</pubDate></item><item><title><![CDATA[Reply to Design - STL Container - Zeiger oder StackObjekte ? on Tue, 12 Jun 2007 15:29:51 GMT]]></title><description><![CDATA[<p>Also die Gründe, wann man was einsetzt, sind eigentlich in diesem Thread von mir genannt. Aber ich mach mal ein stichwortartiges Fazit:</p>
<p>Die Std-Container und die Std-Algorithmen sind eigentlich dafür ausgelegt, Objekte aufzunehmen bzw. zu verarbeiten. Deshalb sollte man erstmal von Objekten ausgehen, z.B. std::vector&lt;string&gt; oder std::vector&lt;int&gt; oder... So sollte man erstmal denken.</p>
<p>Nun die Ausnahmen:<br />
1. Wenn man polymorphe Objekte (also verschiedene Typen eines bekannten Basistyps) speichern will, muß man Pointer speichern. Oder komfortablerweise vielleicht einen Handler oder Smartpointer benutzen.</p>
<p>2. Wenn beim hinzufügen und löschen von großen Objekten zu viel Zeit verschwendet wird, und dieses für den eigenen Anwendungsfall nicht tragbar ist, ist die Lösung aus Ausnahme 1 anzuwenden. Wobei Handler/Smartpointer auch wieder ein gewisser Overhead sein können. Wenns hart auf hart kommt, rohe Pointer. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Andere Gründe und eine andere Taktik fällt mir nicht ein. <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>
<blockquote>
<p>Der einzige Unterschied ist doch, dass ich in der Map einmal nur Zeiger drin habe, beim anderen Ansatz aber ganze Objekte (oder nur Referenzen darauf), oder?</p>
</blockquote>
<p>Referenzen wären schön, dann bräuchte man niemals Pointer. Es ist tatsächlich so: entweder Pointer oder ganze Objekte. Wobei ganze Objekte ja nicht nachteilig sind, wenn du z.B. in einem Container suchst oder iterierst. Es sind nur die zwei Ausnahmen von oben. Wobei Ausnahme 2 ab C++2009 wohl (hoffentlich) entfallen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1304170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1304170</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Tue, 12 Jun 2007 15:29:51 GMT</pubDate></item><item><title><![CDATA[Reply to Design - STL Container - Zeiger oder StackObjekte ? on Tue, 12 Jun 2007 19:01:05 GMT]]></title><description><![CDATA[<p>Vielen Dank!</p>
<p>Hab mir das halt nur einfach vorgestellt, dass der Prozessor (oder wer auch immer das handhabt, die Laufzeitumgebung oder wer auch immer) es einfacher hat, wenn man nur mit Zeigern die ganzen STL-Operationen machen muss, statt mit Objekten!</p>
<p>Gibts denn noch nen weiteren handfesten Vorteil für die Benutzung von Objekte in Containern zu dem, dass diese (Container) extra für Objekte (statt Zeiger) ausgelegt sind?</p>
<p>Jetzt hätt ich mal noch ne weitere Frage zu dem Thema Objekte vs. Zeiger (oder muss ich dazu nen neuen Thread aufmachen?):</p>
<p>Wie ist denn da in C++ der Ansatz der Wahl:<br />
Ich hab eine Hauptklasse meines Programmes, diese benötigt ein Bildschirmobjekt, darauf ein Fensterobjekt, zu diesem wiederum ein Menüobjekt mit entsprechenden Menüobjekteinträgen (auch alles Objekte) etc. etc.<br />
Diese ganzen Objekte müssen während der gesamten Laufzeit zur Verfügung stehen (der Screnn wird z.B. erst ganz am Schluss zugemacht)!</p>
<p>Mein bisheriger Ansatz war so, diese Objekte in main() anzulegen, danach die Hauptprogrammklasse zu erzeugen (wo es ging als Stackobjekte), so dass nach Beenden des Hauptprogrammes alles wieder automatisch aufgeräumt wird.</p>
<p>Nun brauch ich Teile davon in einer anderen Konstallation.<br />
Am liebsten würde ich alles in der init-Methode der Hauptklasse erzeugen, dann müsste ich aber für alle der o.a. Objekte Klassenmember bereithalten, oder wild Zeiger rumreichen und am Schluß darauf achten diese auch wieder mit einem delete zu versehen!</p>
<p>Alle diese Ansätze sagen mir nicht sehr zu (inkl. dem dezeitigen)!</p>
<p>Wie mach ich sowas denn &quot;richtig&quot; (dürfte ja ein &quot;Problem&quot; sein mit dem jeder früher oder später mal zu kämpfen hat)?</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1304340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1304340</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Tue, 12 Jun 2007 19:01:05 GMT</pubDate></item></channel></rss>